标准光照模型进入摄像机的光线分为4部分:环境光(Ambient)、漫反射(Diffuse)、高光反射(Specular)、自发光(Emissive)。每部分使用一种方法计算其贡献度。
1. Ambient
即使在黑暗环境下,世界上通常也仍然有光源(月光,远处的光),所以物体几乎完全不会黑暗。为了模拟这这个, 近似模拟间接光照,简化计算。通常为全局变量。
2. Diffuse
折射、反射。 模拟光源对物体的方向性影响(Directional Impact)。
漫反射光照符合兰伯特定律:反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。
3. Specular
模拟有光泽物体上面出现的亮点。镜面光照的颜色相比于物体的颜色会更倾向于光的颜色。
高光反射可以让物体看起来有光泽,比如:金属质感、巧克力豆质感。
4. Emissive
通常在实时渲染中,自发光的表面往往不会照亮周围的表面,即:这个物体不会被当成一个光源。
标准光照模型中,通常至少有三种光照分量相加,既 Ambient + Diffuse + Specular 得到当前颜色值。
计算公式:
1. Amdient
I = Iamdient Kalbedo
Iamdient是环境光强,Kalbedo为物体对环境光的反射系数。
2. Diffuse
兰伯特定律(Lambert):垂直照向平面的线比从侧面照向平面的线更加强烈。
Cdiffuse = (Clight * Mdiffuse)max(0, (n·L))
n 表示法线方向 (归一化)
L 表示光源方向 (归一化)
Clight 表示光源颜色
Mdiffuse 表示材质的漫反射颜色
n·L 点积
为防止法线和光源方向点积结果为负值,这里使用max函数。
半兰伯特定律:半兰伯特是没有任何物理依据的,仅仅是一个视觉加强技术。
Cdiffuse = (Clight * Mdiffuse)(0.5 * (n·L) + 0.5)
3. Specular
Phong模型 - 冯氏光照模型(Phong Light Mode)
计算高光反射需要知道:表面法线(n)、视角方向(v)、光源方向(I)、反射方向(r),这里的矢量都需要是单位矢量。
Cspecular = (Clight * Mspecular)pow(max(0,(v·r)), Mgloss)
Mgloss 表示材质的光泽度,也称为反光度,用于控制高光区域的“亮点”有多宽,这个值越大,亮点越小;
Mspecular 表示材质的高光反射颜色,用于控制该材质对高光反射的强度和颜。
Clight 表示光源的颜色和强度;
n 表示法线方向 (归一化)
I 表示光源方向 (归一化)
r = 2(n·I)n - I
v 视角(摄像机)方向 (归一化)
Blinn-Phong模型
在Phong模型基础上,Blinn简化了计算:用新的矢量 h 来代替反射方向 r , h 是通过对 v 和 I 取平均后再归一化得到的:
Cspecular = (Clight * Mspecule)pow(max(0,(n·h)),Mgloss)
h = (v + I)/(|v + I|) (归一化)因为此时可以认为单位 v 矢量和单位 I 矢量都是定值,因此 h 是一个常量;但是当单位 v 矢量和单位 I 矢量不是定值时,Phong模型会更快。
4. 斯涅尔折射
斯涅尔定律: 折射
和 分别是介质的折射率。真空的折射率为1, 玻璃的折射率为1.5
5. 菲涅尔反射
菲涅尔反射描述了一种光学现象。
Schlick菲涅尔近似等式:
F0是一个反射系数,用于控制菲涅尔反射的强度。
v 是视角方向
n 是表面法线
Empricial菲涅尔近似等式:
读: 《Unity Shader入门精要》 - 冯乐乐