光照模型
1.定义:光照模型就是一个公式,使用这个公式来计算在某个点的光照效果
2.标准光照模型
在标准光照模型中,我们把进入摄像机的光分为下面四部分:
1)自发光
2)高光反射
Specular=平行光 * pow (max(0,cosθ),参数x)
(θ为平行光的反射光与视野方向的夹角)
************Blinn光照模型和Blinn-Phong 光照模型 ************
Blinn光照模型:Specular =平行光 * pow ( max ( 0 , cosθ) , 参数x )
Blinn-Phong光照模型:Specular =平行光 * pow ( max ( 0 , cosθ) , 参数x )
(θ为平行光与视野方向夹角的平分线与法线的夹角)
区别:Blinn-Phong 的高光范围比Blinn的大点,比较常用,因为效果好
3)漫反射
Diffuse = 平行光.颜色 * max(0,cosθ)
(cosθ=光和法线的夹角)
(因为背光面与光的夹角都大于90°,取负数相乘的话没意义,所以用max)
*cosθ的计算:
PS:逐顶点光照:要把光照的计算放在顶点函数里;逐像素光照,则放在片元函数里面。
一个模型顶点的数量较少,放在顶点函数里计算会快点,不过效果可能不那么好,想法放在片元函数里效果会比较好,因为处理的次数更多,不过速度会慢
兰伯特光照模型与半兰伯特光照模型
兰伯特光照模型:Diffuse = 平行光.颜色 * max(0,cosθ)
半兰伯特光照模型:Diffuse = 平行光.颜色 * (cosθ * 0.5 +0.5)
区别:通过公式我们可以看到处于背光面(与平行光的夹角 >= 90° )的cosθ值基本全为0到-1,这样呈现出来的颜色即全为黑色;而半兰伯特通过变换公式,使得这部分的cosθ值处在0~1之间,使得背光面不是全黑的
cosθ
(cosθ * 0.5 +0.5)
4)环境光
3.相关平行变量
1)只有定义了正确的LightMode才能得到一些unity的内置光照变量
Tags{“LightMode”=”ForwardBase”} (ForwardBase:前向渲染)
2)#include "Lighting.cginc"包含unity的内置文件,才可以使用unity内置的一些变量
3)normalize()把向量归一化
4)max()用来取得函数中最大的一个
5)dot() 用来取得两个向量的cosθ值
6)_WorldSpaceLightPos0 取得平行光的向量
_LightColor0 取得平行光的颜色
UNITY_MATRIX_MVP 这个矩阵用来把一个坐标从模型空间转换到剪裁空间
UNITY_LIGHTMODEL_AMBIENT.rgb环境光的颜色