Lambert,Half Lambert ,Phong ,Blin-Phong,BRDF,BSSRDF的比較

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;
    }

image

image

image

 

image

 

--------------------

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 從頂點指向光源的單位向量

image

image

image

--------------------

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 光照模型得到的高光反射值的和

image

 

image

--------------------

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的定義是:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章