OpenGL学习笔记(12)基本光照

 

比较这两个球api

image

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

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

首先定一个白色的球体

以下图函数

image

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

启用光照功能

依然是glEnable函数,参数是GL_LIGHTINGspa

如今的效果orm

image

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

建立光源

要使用光源必须先启用光源,使用glEnable函数启用GL_LIGHT0-7的光源,因此一共能够启用8个光源.ci

glLight方法用于建立光源,其能够设置与光相关的一些参数,以下get

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在干吗