《光照》
标签(空格分隔): OpenGL编程指南第七版
5.1 隐藏表面消除工具箱
隐藏表面消除就是消除实心物体被其他物体所遮挡的部分。实现隐藏表面消除的最简单的方法就是使用深度缓冲区(z缓冲区)。启用深度缓冲区后,在绘制每个新像素之前,OpenGL就会把它的深度值与已经存储在深度缓冲区的这个像素的深度值进行比较。如果新像素比原先像素更靠近观察平面,这个新像素的颜色和深度值就会取代原先那个像素。如果新像素的深度值大于原先像素的深度值,新像素就会被遮挡,它的颜色和深度值将丢弃。
5.2 现实世界和OpenGL光照
OpenGL光照模型把光分为4种独立成分:环境光、散射光、镜面光、发射光。
5.2.1 环境光、散射光、镜面光、发射光
5.2.2 材料颜色
5.2.3 光和材料的RGB值
5.3 一个简单的例子
- 为每个物体的顶点定义法线向量:为了进行正确的光照计算,表面法线必须为单位长度。还必须保证对物体所进行的模型视图变换并没有对表面法线进行缩放,最终法线仍然保持为单位长度。
- GL_RESCALE_NORMAL和GL_NORMALIZE:
5.4 创建光源
void glLight{if}(GLenum light, GLenum pname, TYPE param);
void glLight{if}v(GLenum light, GLenum pname, TYPE* param);
5.4.1 颜色
- GL_DIFFUSE参数可能最接近于我们想象的“光的颜色”
- 如果我们想要创建逼真的效果,可以把GL_SPECULAR参数的值设置为和GL_DIFFUSE参数的值相同。
5.4.2 位置和衰减
- 方向性光源:光源位于无限远,当光线到达物体时,可以认为所有的光线都是平行的。如太阳。
- 位置性光源:它在场景中的准确位置决定了它对场景所产生的效果。如台灯。
- 位置性光源的衰减因子:
只有发射光和全局环境光没有衰减,环境光、散射光和镜面光的强度都会衰减
5.4.3 聚光灯
5.4.4 多光源
5.4.5 控制光源的位置和方向
- 静止
- 独立地移动:在视图变换之后设置光源位置
- 与观察点一起移动:在视图变换之前设置光源位置
5.5 选择光照模型
void glLightModel{if}(GLenum pname, TYPE param);
void glLightModel{if}v(GLenum pname, TYPE* param);
5.5.1 全局环境光
由于全局环境光,我们才能在场景中没有指定任何散射光的情况下,仍然能够看到场景中的物体。
5.5.2 局部观察点和无限远的观察点
5.5.3 双面光照
5.5.4 镜面辅助颜色
5.6 定义材料属性
void glMaterial{if}(GLenum face, GLenum pname, TYPE param);
void glMaterial{if}(GLenum face, GLenum pname, TYPE* param);
5.6.5 颜色材料模式
void glColorMaterial(GLEenum face, GLenum mode);减少修改材料属性带来的开销
5.7 和光照相关的数学知识
5.7.1 材料的发射光
由GL_EMISSION复制
5.7.2 经过缩放的全局环境光
5.7.3 光源的贡献
衰减因子
聚光灯效果
环境光
散射光
镜面光
5.7.4 完整的光照计算公式
5.7.5 镜面辅助颜色
如果当前的光照模型颜色控制为GL_SEPARATE_SPECULAR_COLOR,每个顶点将会产生主颜色和辅助颜色:
主颜色 = 顶点的材料发射颜色 + 根据顶点出的材料环境颜色属性进行缩放后的全局环境光 + 来自所有光源并进行了适当衰减的环境光和散射光成分
辅助颜色 = 来自所有光源并进行了适当衰减的镜面光成分
在惊醒纹理贴图时,只有主颜色与纹理颜色进行混合。在纹理操作之后,辅助颜色被添加到主颜色和纹理颜色混合所产生的颜色之中。