Unity Shader入门教程(四):光照模型理论
发表于2018-06-06
给大家介绍Unity光照模型理论之前,大家需要了解图形学中的两个基础光照模型原理,这样才会更利于大家去理解和使用Unity中的光照模型。
Lambert是理想的漫反射模型,他表现的材质较为均匀,不能反映粗糙度带来的变化。
兰伯特定律:反射光线的强度与表面光线和光源方向之间的夹角的余弦成正比。
Cdiffuse = (Clight·Mdiffuse)max(0, n·I)
其中n代表的是表面法线,I是由光线与表面的交点指向光源的单位矢量,Mdiffuse是材质的漫发射颜色,Clight是光源的颜色
二、Half Lambert(半兰伯特)光照模型
该光照模型是由Valve公司开发《半条命》时提出的,是一种用于低光照区域照亮物体的技术。
由前面的兰伯特公式我们知道一旦入射光向量与材质表面的角度大于90度,那么得到的漫反射颜色就会全部变为黑色,没有任何明暗变化效果!
半兰伯特是将n·I得到的结果加工,通常是先乘以0.5,然后再加上0.5,这样就将光照值从(-1,1)重新映射到了(0,1)。
三、Phong(冯氏光照模型)
冯氏光照模型引入了高光来增强渲染的真实感,他引入了观察者视角这一参数,反射向量R与视角向量V的夹角决定了高光的强度。
Phong = Ambient(环境光)+Diffuse(漫发射)+Specular(高光)
Cspecular = (Clight·Mspecular)max(0,v·r)Mgloss
其中Mgloss是材质的光泽度,也被称为反光度。它用于控制高光区域的“亮点”有多宽,Mgloss越大,亮点越小。
Mspecular是材质的高光反射颜色,它用于控制材质对于高光反射的强度和颜色。
Clight则是光源的颜色和强度。
四、Blinn-Phong
Phong模型效果不错,但是如果光源靠近视野的位置就会出现入射光的反射向量与视线向量的夹角大于90度,一旦大于90度,那么max(0,v·r)会把负值直接变为0,于是就会出现非常锐利的明暗过渡效果,这看起来有些失真!
Blind模型避免了计算反射向量r,引入了半程向量概念,h:
h=normalize(ViewDir + LightDir)
然后使用n和h之间的夹角进行计算,而非使用v和r之间的夹角:
总结一下Blinn-Phong的公式如下:
Cspecular = (Clight·Mspecular)*saturate(n·h)Mgloss