zoukankan      html  css  js  c++  java
  • OpenGL学习笔记(12)基本光照

    比较这两个球

    image

    在现实生活中,比如一个表面是白色的球体,假设背景是黑色,然后没有任何灯光的照射那么就如右侧的圆一般,但这在有点不可能.现实中我们看到的都是左侧这样带有光照的球体,所以右侧的形状只能是几何体,无法模拟真实世界的球体.

    下面我们来看一下一些基本的概念

    首先定一个白色的球体

    如下图

    image

    注意这是一个球体,但背面也是白色的,你看不到.

    启用光照功能

    依然是glEnable函数,参数是GL_LIGHTING

    现在的效果

    image

    到这一步不行,还要为球体增加光源

    创建光源

    要使用光源必须先启用光源,使用glEnable函数启用GL_LIGHT0-7的光源,所以一共可以启用8个光源.

    glLight方法用于创建光源,其可以设置与光相关的一些参数,如下

    image

    如设置光源位置

    GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    现在效果如下

    image

    感觉好多了

    创建多光源

    即设置多个光源,真实世界中往往会有很多的光源.即启用了多个光源

    GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
     GLfloat light1_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
     GLfloat light1_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
     GLfloat light1_specular[] = { 1.0, 1.0, 1.0, 1.0 };
     GLfloat light1_position[] = { -2.0, 2.0, 1.0, 1.0 };
     GLfloat spot_direction[] = { -1.0, -1.0, 0.0 };
     glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);
     glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
     glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);
     glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
     glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.5);
     glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.5);
     glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.2);
     glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 45.0);
     glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, spot_direction);
     glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0);
     glEnable(GL_LIGHT1);

    如上启用了GL_LIGHT0和GL_LIGHT1,其两个默认值并不相同

    材质(glMaterial)

    阳光照到一块木板上和照到一个金属上的反应是不一样的,金属表面则会出现光泽,所以说不同材质的物体,产生光照的效果则会不同,以下是定义了材质以后效果,出现了一些光泽

    image

    face can be GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK to indicate to which faces of the object the material should be applied
    可以定义材质(正反面)以下的一些特性

    image

    光照模型(glLightModel)

    4个点

    • The global ambient light intensity
    • Whether the viewpoint position is local to the scene or should be considered to be an infinite distance away
    • Whether lighting calculations should be performed differently for both the front and back faces of objects
    • Whether the specular color should be separated from ambient and diffuse colors and applied after the texturing operation

    只能先基本有个概念了,先看得懂api在干嘛

  • 相关阅读:
    PAT Basic 1077 互评成绩计算 (20 分)
    PAT Basic 1055 集体照 (25 分)
    PAT Basic 1059 C语言竞赛 (20 分)
    PAT Basic 1072 开学寄语 (20 分)
    PAT Basic 1049 数列的片段和 (20 分)
    蓝桥杯BASIC-13 数列排序
    蓝桥杯入门——3.序列求和
    蓝桥杯入门——2.圆的面积
    蓝桥杯入门——1.Fibonacci数列
    树的总结(遍历,BST,AVL原型,堆,练习题)
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1861928.html
Copyright © 2011-2022 走看看