基本光照成分
实际使用中的光照模型把光分成 4 种独立的成分:环境光(Ambient Light)、散射光(Diffuse Light)、镜面光(Specular Light)和自发光(Emissive Light)。
环境光(Ambient Light)
环境光是那些在环境中进行了充分的散射,无法分辨其原始方向的光。它似乎来自于所有方向。当环境光撞击表面时,它会向所有方向均匀发散,所以我们看到的反射环境光不随视角变化。
环境光一般是一个全局变量: cambient = gambient
在 Unity 中,环境光是通过 Window/Lighting 菜单选项设置:
漫反射(Diffuse Light)
散射光来自于某个方向,所以如果灯光从正面照射表面,它就看起来亮一些,如果从侧面照射,就会暗一些。但是当灯光撞击表面时,它会均匀地向所有方向发散,所以散射光也不随视角变化。
散射光计算:
cdiffuse = clight * cmaterial * max(0, dot(N, L))
高光(Specular Light)
镜面高光来自于某个方向,并且倾向于从表面向某个特定方向反射。高光会随视角变化。
-
Phong
cspecular = clight * cmaterial * max(0, dot(V, R))gloss
-
Blinn-Phong
cspecular = clight * cmaterial * max(0, dot(N, H))gloss
其中,H 是 V 和 L 的归一化和向量。
自发光(Emissive Light)
自发光一般就是材质的一个颜色属性,自发光不会作为光源照亮别的物体。
cemissive = memissive
合成光照
c = cambient + cdiffuse + cspecular + cemissive
参考资料:
- 《OpenGL编程指南》第五版,机械工业出版社
- 《Unity Shader入门精要》,人民邮电出版社
转载请注明出处:
This work is licensed under a MIT License.