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

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