转载自风宇冲Unity3D教程学院
简单的说,带光照的Shader的最终颜色输出为 材质颜色 * 光颜色,其中
材质颜色:之前已经提到过,固定格式tex2D (_MainTex, i.uv)
光颜色:光颜色 = 自发光 + 环境光 + 漫反射光 + 镜面光
下面详细讲解这四种光
一:自发光
由物体表面向四面八方发出的光
emissive = colorEmissive
colorEmissive 自发光的颜色
二:环境光
物体表面接收的来自四面八方发出的光, 然后向四面八方反射
ambient = Ka * colorAmbient
Ka 环境光系数
colorAmbient 环境光颜色
什么是法线?
法线,normal line,是始终垂直于某平面的一条向量,公正无私,像个法官一样,故取名为法线。
曲面上某一点的法线指的是经过这一点并且与该点切平面垂直的那条直线(即向量)。
法线是有方向的:一般来说,由立体的内部指向外部的是法线正方向,反过来的是法线负方向。
三:漫反射光
漫反射与镜面反射的主要区别是法线的分布。如果物体完全光滑的话,那么法线完全垂直于平面,例如镜面及锃亮的金属表面。 而很多看起来很光滑平整的物体,如纸,桌面,衣服等,实际上,用放大镜仔细观察,就会看到其表面是凹凸不平的。法线并不与肉眼看见的面垂直,而是与实际的面平行。
漫反射:光射到粗糙表面时,表面会把光线向着四面八方反射,所以即使入射线平行,由于各点的法线方向不一致,造成反射光线向不同的方向无规则地反射。这种反射光称为漫反射光。
漫反射的计算
diffuse = Kd x colorLight x max(N*L,0)
Kd 漫反射系数
colorLight 光的颜色
N 单位法线向量
L 由点指向光源的单位向量
其中N与L点乘,如果结果小于等于0,则漫反射为0
四:镜面反射光
镜面反射:光射到表面光滑平整,法线均匀的物体表面上,这种反射光称为镜面反射光。
Ks 镜面系数
colorLight 光的颜色
N 单位法线向量
L 由点指向光源的单位向量
V 由点指向观察者的单位向量
H (L+V)向量的单位化向量,即normalize(L+V)
shininess 镜面强度系数,值越小,高光越分散;值越高,高光越集中。
facing 如果N与L的点乘大于0,则facing为1,如果小于等于0,则facing为0
漫反射与镜面反射
光的反射方式主要是由物体表面的材质决定的。
如果来自相同单一光源,那么计算时两者的光源颜色colorLight是相同的。
核心都是单位法线参与的点乘运算。
漫反射只与光的入射角度有关
镜面反射与光的入射角度及观察者的角度都有关
Surface Shader里的光照模型
简而言之, Lambert是漫反射,BlinnPhong含镜面反射。相关定义可以在Lighting.cginc里查看
Blinn-Phong:
Phone Reflection模型的一个衍变光照模型。OpenGl及D3D固定管线的默认光照模型,光照在顶点阶段就已经计算完毕,之后顶点间像素的值通过插值获取。
http://en.wikipedia.org/wiki/Blinn–Phong_shading_model
Lambert:
仅有漫反射,与观察者(摄像机)视角无关.