转载自:http://blog.csdn.net/ProgramRookie/article/details/4202180
1.基本光照模型:
sufaceColor = emissive + ambient + diffuse + specular
以下是公式各个项的解析:
(1)emissive放射光
它是独立于所有光源的,是单纯由物体材质产生的光(说句废话,不能作为光源照亮其他物体,其实在shader实现里很明确)
emissive = Ke;
这个公式明显可以看出,光照颜色完全取决于材质
(2)ambient环境光
它也是独立于单一光源的,毕竟环境二子,应该体现了这个概念只与物体所在的环境有关,可以想象成其他光经过多次折射后就造成了物体四面八方受到了同等强度的光.
ambient = Ka * globalAmbientLightColor;
这个公式表示了顶点的颜色取决于自身材质与环境光.
(3)Diffuse漫反射
它与一个独立光源相联系,它对于人的眼睛位置来说无关,与灯的位置有关,因为一块粗糙的黑板,无论你在哪个角度看某个点的光强都是一样的,但是如果移动光源就不一样了,光源越相比某点越倾斜,某点接受的入射光越少.
diffuse = Kd * max( N*L, 0 ) * lightColor;
这个公式多了一个max( N*L, 0 )概念,也这里是表示点的法线与光的入射角的夹角越小,光越强( max函数是为了表示如果照在顶点背面,那么就应该没有光照 ).
(4)Specular镜面反射
与漫反射不同,镜面发射的反射光集中于一个区域,如果眼睛越离开这个区域去观察受光点,那么光照作用就越不明显.而且,表面光泽度越好的物体,高光区越少(也就是反射光越集中).
specular = Ks * lightColor * facing * pow ( ( max( N * 眼睛与入射光到点的中间向量, 0 ) ), shininess );
公式难理解的就是为什么用pow ( ( max( N * 眼睛与入射光到点的中间向量, 0 ) ), shininess )来模拟高光区的效果,我的理解是,眼睛能观察到的光在入射光根据顶点法线的反射光附近最强,也就是说眼睛带顶点与入射光的中间向量与法线的点积越小,光的强度越大.至于为什么要用shininess次方,纯粹是为了控制高光区域的大小,因为shininess越大,则随着夹角增大光强下降越快,那么高光区域就越大,反之越小.