游戏中常用的光主要有四种:环境光(ambient)、漫反射光(diffuse)、镜面反射光(高光,specular)和自发光(emissive)。
基本公式:
1.环境光
环境光是看起来在明亮环境中无所不在的光。比如说,看下你的桌底,尽管没有光源直接照射,你似乎还是可以看到桌下的深远地方并且描绘出其外形。这种光是通过物体表面与光线的不断交互产生的(比如不断反射、折射叠加产生的)。当光线到达物体表面时,他们会被部分或完全的反射、吸收掉,这个过程会持续无数次。所以还是会有光线可以到底你的桌底,即使只是很小的一部分。
其中:
- Ka是材质的环境反射系数
- globalAmbient是入射环境光的颜色。
2.漫反射光
漫反射光代表了从一个表面相等地向所有方向反射出去的方向光。
公式如下:
其中:
- Kd是材质的漫反射颜色
- lightColor 是灯光的颜色
- N是标准化的顶点法向量
- L是标准化的指向灯光的向量
这里需要解释一下
规范化的向量N和L的点积是两个向量之间夹角的一个度量,夹角越小,P点受到更多的入射光照。而背向光源的表面将产生负数点积值,因此,公式max(dot(N,L),0)
使得背向光源的表面的漫反射光为0,确保这些表面不会显示漫反射光照。
3.镜面反射光
镜面反射光又称高光,是指由光源直接经物体表面反射入眼睛的光线。镜面反射使物体看上去有光泽,粗糙表面因反射率不高,所以缺乏此效果。镜面反射的强度取决于物体,光源和观察者。
3.1 Phong光照模型
其中:
- Ks是材质的镜面反射颜色
- lightColor是入射镜面反射光的颜色
- N是归一化的表面法向量
- R是归一化的反射光方向向量
- shininess是高光指数,其值越大,则表面越光滑,反射光越集中,高光范围越小
反射光方向R的计算公式:
其中:
- N是归一化的表面法向量
- L是归一化的指向灯光的方向向量
3.2 改进的Blinn-Phong光照模型
其中:
- Ks是材质的镜面反射颜色
- lightColor是入射镜面反射光的颜色
- N是归一化的表面法向量
- H是归一化的指向灯光的方向向量L和视点方向V的中间向量
- shininess是高光指数,其值越大,则表面越光滑,反射光越集中,高光范围越小
中间向量H的计算公式:
其中:
- L是归一化的指向灯光的方向向量
- V是归一化的指向视点的方向向量
Blinn-Phong光照模型与Phong光照模型的不同在于同样的参数下,前者的高光范围要大一点。同时,H的计算要比R的计算简单一些。在代码里R的计算是这么写的:
R = 2 * (dot(N, L) * N) - L
,而H是这么写的:
H = normalize(L + V)
,可以看出Blinn-Phong光照模型的计算确实简单一些。
4.自发光
自发光即物体自身所发出的光,但并不影响场景中其他物体。公式为:
其中:
- Ke代表材质的放射光颜色
参考资料:
http://www.cnblogs.com/QG-whz/p/5189831.html?utm_source=tuicool&utm_medium=referral
http://blog.csdn.net/bianchengxiaosheng/article/details/51427407