OpenGL光照

1. OpenGL光照分类

OpenGL光由自发光(Emitted Light)、环境光(Ambient Light)、漫反射光(Diffuse Light)和高光(Specular Light)组成

自发光(Emitted Light):由物体自身发出并且不受任何光源影响。如果物体本身不发光,则无此属性。

环境光(Ambient Light):那些在环境中进行了充分散射,而无法分别其方向的光。光线在物体表面上向各个方向上均匀泛射,场景中的物体都会泛射光,这些泛射光又会照射到其他物体上继续被泛射,直到光子能量耗尽为止,这样整个场景中散布着这样的泛射光。在编程时,可通过设置一个颜色常量来表示环境光或使用ambient occlusion map(环境闭包贴图)来处理环境光。

漫反射光(Diffuse Light):投射在粗糙表面上的光向各个方向反射的现象,这些反射出来的光被称为漫反射光。无论在何处观察,散射光看上去亮度都相同。我们之所以能看到物体,就是因为物体将入射的光超各个方向反射。物体的漫反射材质属性对物体的颜色起着决定性作用。

镜面光(Specular Light):光线来自一个特定的方向,然后再物体表面上以一个特定的方向反射出去。正是由于镜面光让物体看上去有光泽。镜面反射与物体的镜面反射材质属性有很大关系。在OpenGL中,镜面光的强度可通过光泽度(shininess)来调节。


2. 光照计算分类

光照效果是由自发光,环境光,漫反射光以及镜面光四个部分组成,这四个部分各自独立计算,然后再累加起来得到最终的光照效果。

自发光:自发光颜色=物体自发光材质的颜色

环境光:环境光颜色=光源的环境光颜色×物体环境光材质的颜色

漫反射光:漫反射光颜色=光源的漫反射光颜色×物体的漫反射材质的颜色×DiffuseFactor。其中DiffuseFactor其中漫反射因子DiffuseFactor是光线与顶点法向量的点积DiffuseFactor=max(0, dot(N, L))。公式中的顶点法线必须是归一化的。在图形学中,点积表示两个向量之间夹角的cos值。因此这个公式解释了漫反射的规律:顶点法线正对入射光线,漫反射效果最强,顶点法线背对入射光线(角度大于等于90度)就完全没有漫反射效果。


镜面光反射:镜面光反射颜色=光源的镜面光颜色×物体的镜面材质颜色×SpecularFactor。其中SpecularFactor=power(max(0, dot(N,H)), shininess)  H=normalise(L+E)。与漫反射不同,镜面反射受观察者的位置影响,这一点在之前的公式中可以清楚地看出。H向量是视线向量E与光向量L之和,其几何意义就是视线与光线夹角的平分线。而H和N的点积的几何意义就是说这个平分线与法线夹角的cos值,然后将这个cos值进行shininess次方得到最终的镜面反射因子SpecularFactor。这里的关键点在于视线与光线的平分线与法线的点积的计算。这表示,当视线与光线在表面处的反射光线夹角越小时,镜面反射效果最明显。


衰减因子:光源发射的光线在其传播过程中,会与空气中的其他粒子碰撞,其能量会逐渐衰减。在OpenGL中,这是通过将光照强度乘以随传播距离变化的衰减因子来模拟实现的。这个衰减因子的计算公式如下

衰减因子=1.0/(距离衰减常量+线性衰减常量×距离 + 二次衰减常量×距离的平方)

其中距离衰减常量,线性衰减常量和二次衰减常量均为常量值。

猜你喜欢

转载自blog.csdn.net/qq_22822335/article/details/50932003