Lambert 光照模型(环境光+漫反射)
Idiff = kd * Ia + kd * Il * (N·L) = kd * Ia + kd * Il * dot(N, L)
Ia 是环境光的强度
kd 为材质对环境光的反射系数(0 < kd < 1)
Il 是方向光的强度
kd 为材质对环境光的反射系数(0 < kd < 1)
θ 是入射光方向和顶点法线的夹角。当夹角为 0°,说明入射光平行于法线(垂直于表面),此时反射强度最大;当夹角为 90° 时,说明入射光同表面顶点切线平行,此时物体不会反射任何光线。
N 顶点单位法向量
L 与从顶点指向光源的单位向量
Unity 中的 Lambert 光照模型的源码:
inline fixed4 UnityLambertLight (SurfaceOutput s, UnityLight light)
{
fixed diff = max (0, dot (s.Normal, light.dir));
fixed4 c;
c.rgb = s.Albedo * light.color * diff;
c.a = s.Alpha;
return c;
}
--------------------
Half Lambert 光照模型(环境光+漫反射+提亮暗部)
Half Lambert 用来给在比较暗的区域显示物体
inline half4 LightingCustomLambert(SurfaceOutput s, half3 lightDir, half atten)
{
// Lambert
half diffLight = dot(s.Normal, lightDir);
// half Lambert
diffLight = diffLight * 0.5 + 0.5;
half4 c;
c.rgb = s.Albedo * _LightColor0.rgb * (diffLight * atten * 1);
c.a = s.Alpha;
return c;
}
在 Lambert 的基础上,通过 diffLight = diffLight * 0.5 + 0.5,使得 diffLight 变大了从而增强了在光线暗的区域的视觉效果。
--------------------
Phong 光照模型(环境光+漫反射+高光反射)
Phong在Lambert模型的基础上,加入对光滑表面的高光反射
Ispec = ks * Il * (R·V) ^ p
R + L = 2 * N * (N·L) = > R = 2 * N * (N·L) - L
得到:Ispec = ks * Il * ((2 * N * (N·L) - L)·V) ^ p
ks 是材质的镜面反射系数
Il 是光强
R 为反射光的方向
V 表示从顶点到视点的方向
p 是高光指数,p 越大反射越集中,当慢慢视线方向偏离反射方向光线开始慢慢衰减,反之 p 越小观察到的光斑区域也就越小,反射光强度也很弱。
N 单位法向量
L 从顶点指向光源的单位向量
--------------------
Blin-Phong光照模型(环境光+漫反射+高光反射,表现和Phong 光照模型差不多,但优化了效率)
Ispec = ks * Il * (N·H) ^ p
ks 是材质的镜面反射系数
Il 是光强
N 为入射点的单位法向量
H 表示光线方向和视角方向的半角向量
p 是高光指数,p 越大反射越集中,当慢慢视线方向偏离反射方向光线开始慢慢衰减,反之 p 越小观察到的光斑区域也就越小,反射光强度也很弱
用到了视角方向和光线方向构成的半角向量
Unity 中的 BlinnPhong 光照模型的代码:
inline fixed4 UnityBlinnPhongLight (SurfaceOutput s, half3 viewDir, UnityLight light)
{
half3 h = normalize (light.dir + viewDir);
fixed diff = max (0, dot (s.Normal, light.dir));
float nh = max (0, dot (s.Normal, h));
float spec = pow (nh, s.Specular*128.0) * s.Gloss;
fixed4 c;
c.rgb = s.Albedo * light.color * diff + light.color * _SpecColor.rgb * spec;
c.a = s.Alpha;
return c;
}
首先计算了光线方向和视角方向的半角向量 h,接着计算了 Lambert 光照模型中计算光强的乘法因子 diff,然后又计算了法向量和 h 的点积 nh,
最后通过指数计算得到了高光乘法因子 spec,最终输出就是 Lambert 光照模型得到的漫反射值以及 BlinnPhong 光照模型得到的高光反射值的和
--------------------
BRDF
基于物理的光照模型
一次反射光照的计算是在光线交点的法线半球上的球面积分
双向反射分布函数(Bidirectional Reflectance Distribution Function,BRDF)用来定义给定入射方向上的辐射照度(Irradiance)如何影响给定出射方向上的辐射率(Radiance)。
宏观来看,它描述了入射光线经过某个表面反射后如何在各个出射方向上分布——可以是从理想镜面反射到漫反射、各向同性(Isotropic)或者各向异性(Anisotropic)的各种反射。
计算机图形学中实现BRDF理论模型的一个方法是用微小面元对物体表面进行建模,每一个小平面都是表面上的一个小平面镜,具有随机的大小和角度。这些小平面通常被赋予一个高斯分布的尺寸和角度。
--------------------
BSSRDF
基于物理的光照模型
用于模拟皮肤,BSSRDF可以指定不同的光线入射位置和出射的位置
每一次反射在物体表面上每一个位置都要做一次半球面积分,是一个嵌套积分
最初来源于Jensen在2001年的论文是次表面材质建模最重要的一篇论文[Jensen, Henrik Wann, Stephen R. Marschner, Marc Levoy, and Pat Hanrahan. 2001. "A Practical Model for Subsurface Light Transport." In Proceedings of SIGGRAPH 2001.],
推导了许多重要的物理公式,计算模型,渲染时的参数转换,以及测量了许多生活中常见材质的散射系数等
BSSRDF的定义是: