光照模型
也成为明暗模型,用于计算物体表面某处的光强(颜色值)
光照模型分为两类:
- 基于物理理论的光照模型:偏重于使用物理的度量和统计方法,遵守能量守恒。例如:PBR
- 经验模型:通过前人的总结的经验对光照的一种模拟,例如:Lambert,Phong,Billing-Phong
为什么需要光照模型?
现实中的光照是极其复杂的,而且会受到诸多因素的影响,有限的计算能力无法完全模拟
光照模型发展图
局部光照模型
定义:局部光照模型只关心直接光照部分,即直接从光源发出并照射到物体表面并反射至摄像头的光线
例如:漫反射、高光反射、环境光和自发光
漫反射
定义:当光线照射到模型表面时,光被均匀的被反射到各个方向。在漫反射过程中,光线发生了吸收和散射,而因此改变颜色和方向
计算:Lambert定律:反射光的强度与法线和光线的夹角余弦值成正比
公司:Dot(N,L)
注:漫反射效果与观察者位置无关,与光源位置有关
高光反射
定义:
- 光线没有被物体表面吸收直接发生的反射,光强不变,方向改变
- 高光的反射率根据菲涅尔效应的物理现象决定
计算:反射光的强度与视线和反射光的夹角余弦值成正比
公式:Dot(V,R)^Gloss
注:光泽度影响了物体表面发生高光反射的面积
环境光
定义:一个物体没有被直接光照照射,但是会被间接光照影响,为了处理这种间接光照,光照模型引入了环境光
计算:
自发光
定义:顾名思义,物体自身发出的光线
局部光照模型的整体效果
经典光照模型
Lambert模型
定义:只计算了漫反射部分的光照
计算:Diffuse = 光线颜色 x 漫反射颜色 x Dot(N·L)
//=======计算漫发射======
float3 normalDir = normalize(i.worldNormal);
float3 lightDir = normalize(UnityWorldSpaceLightDir(_WorldSpaceLightPos0.xyz));
float3 Diffuse = _DiffuseColor.rgb * _LightColor0.rgb * saturate(dot(lightDir, normalDir));
注:通过这样的计算方式,模型的暗面会非常的黑,这是我们不希望达到的效果
因此我们用环境光和贴图颜色来作为暗部颜色与亮部进行插值运算
float3 Diffuse2 = lerp(Ambient.rgb * _DiffuseColor.rgb, _LightColor0.rgb * _DiffuseColor.rgb, saturate(dot(lightDir, normalDir)));