OpenGL学习笔记(十)

来源:互联网 发布:大数据概念股涨停 编辑:程序博客网 时间:2024/05/22 00:54

光照

OpenGL的光照模型把光分成4种独立的成分:环境光、散射光、镜面光和发射光。

环境光(ambient light)

环境光并不来自任何特定的方向。它来自某个光源,但光线却是在房间或场景中四处反射,没有方向可言。

散射光(diffuse light)

OpenGL的散射光具有方向性,来自于一个特定的方向,它根据入射光线的角度在表面上均匀地反射开来。因此,如果光线直接指向物体表面,它看上去就更亮一些。如果光线是从一个较大的角度照射到物体表面上,它看上去就显得暗一些。

镜面光

和散射光一样,镜面光也具有很强的方向性,但它的反射角度很锐利,只沿一个特定的方向反射。高强度的镜面光趋向于在它所照射的表面上形成的一个亮点,称为镜面亮点。

为了在场景中增加光照,需要执行如下步骤:

1.   定义每个物体的每个顶点的法线向量。这些法线决定了物体相对于光源的方向

2.   创建和选择一个或多个光源,并设置它们的位置

3.   创建和选择一种光照模型,它定义了全局环境光的层次以及观察点的有效位置

4.   定义场景中物体的材料属性

单位法线

物体的法线向量决定了它相对于光源的方向。对于物体的每个顶点,OpenGL使用法线判断这个顶点从每个光源接收的光线数量。为了进行正确的光照计算,表面法线必须为单位长度。

OpenGL把一条法线自动转换为单位法线,可调用

glEnable(GL_NORMALIZE);

但是,这种方法在效率上有所牺牲。我们可以预先计算单位法线,而不是依赖OpenGL自动执行计算。

启用光照

为了告诉OpenGL使用光照计算,可调用:

glEnable(GL_LIGHTING);

这个调用告诉OpenGL在确定场景中每个顶点的颜色时使用材料属性和光照参数。但是,如果没有指定任何材料属性或光照参数,物体将会保持为黑暗的无光照状态。

创建光源

void glLight{if}(GLenum light,GLenum pname,TYPE param);

void glLight{if}v(GLenum light,GLenum pname,const TYPE *param);

创建light指定的光源,它可以是GL_LIGHT0GL_LIGHT1…GL_LIGHT7。被设置的光源属性是由pname定义的,它指定了一个命名参数,param表示pname属性将要设置的值。pname参数列表如下:

参数名称                                              含义

GL_AMBIENT                                        光的环境强度

GL_DIFFUSE                                                光的散射强度

GL_SPECULAR                                      光的镜面强度

GL_POSITION                                        表示光源位置的坐标(x,y,z,w)

GL_SPOT_DIRECTION                           表示聚光灯方向的向量(x,y,z)

GL_SPOT_EXPONENT                           聚光指数

GL_SPOT_CUTOFF                                聚光灯的切角

GL_CONSTANT_ATTENUATION             常量衰减因子

GL_LINEAR_ATTENUATION                  线性衰减因子

GL_QUADRATIC_ATTENUATION           二次衰减因子

多光源

至少可以在场景中指定8个光源(很可能更多,取决于所使用的OpenGL实现)。由于OpenGL需要通过计算来确定每个顶点从每个光源接收多少光,因此光源的数量越多,对应用程序性能的影响就越大。表示8个光源的常量是GL_LIGHT0GL_LIGHT1…GL_LIGHT7等。启用光源可调用类似glEnable (GL_ LIGHT0)指令。

光照模型

OpenGL的光照模型概念包括下面4个部分:

1.全局环境光强度

2.观察点的位置是位于场景还是位于无限远处

3.物体的正在和背面是否应该执行不同的光照计算

4.镜面颜色是否应该从环境和散射颜色中分离出来,并在纹理操作之后再应用

void glLightModel{if}(GLenum pname,TYPE param);

void glLightModel{if}v(GLenum pname,const TYPE *param);

设置光照模型的属性。被设置的光照模型的特征由pname定义,param表示pname参数被设置的值。pname参数列表如下:

参数名                                                           含义

GL_LIGHT_MODEL_AMBIENT                     整个场景的环境光的RGBA强度

GL_LIGHT_MODEL_LOCAL_VIEWER          镜面反射角度是如何计算的

GL_LIGHT_MODEL_TWO_SIDE                   指定了单面还是双面光照

GL_LIGHT_MODEL_COLOR_CONTROL        镜面颜色的计算是否从环境和散射颜色中分离出来

设置材料属性

void glMaterial{if}(GLenum face,GLenum pname,TYPE param);

void glMaterial{if}v(GLenum face,GLenum pname,const TYPE *param);

指定一种用于光照计算的当前材料属性。face值可为:GL_FRONTGL_BACKGL_FRONT_AND_BACK,表示物体的哪些面应该接受光照。pname表示设置的特定材料属性,param提供了具体的属性值。pname参数列表如下:

参数名                                             含义

GL_AMBIENT                                 材料的环境颜色

GL_DIFFUSE                                         材料的散射颜色

GL_AMBIENT_AND_DIFFUSE        材料的环境和散射颜色

GL_SPECULAR                               材料的镜面颜色

GL_SHININESS                               镜面指数

GL_EMISSION                                材料的发射颜色

GL_COLOR_INDEXES                           环境、散射和镜面颜色索引

原创粉丝点击