PBR.理論


判斷一種PBR光照模型是否是基於物理的,必須滿足以下三個條件:
1)基於微平面(Microfacet)的表面模型。Be based on the microfacet surface model. (2)能量守恆。Be energy conserving. (3)應用基於物理的BRDF。Use a physically based BRDF.
 
原理一 微平面模型 The microfacet model
    描述:任何表面(surface)在微觀尺度下都可以描述為由一系列微小的平面(microfacet)組成,並且我們假設這些微平面都是絕對光滑的鏡面,能夠完美反射光線。
    粗糙度(roughness)參數:沒有任何表面是絕對光滑的,但微表面已經小到沒法在像素尺度上區分,因此我們在像素的尺度上引入了粗糙度的概念(rougness),用來表示與半角向量h大致對齊的microfacet的占比。 roughness是一個統計學上的近似。
    散射(scatter):材質表面越粗糙,說明其微表面的方向越不一致,那其就會將光線反射到各個不同的方向,這就是散射。越光滑的表面,其微表面反射方向越一致,那么材質表面的高光區域就越集中越銳利。
    半角向量h(halfway vector):光照向量l和視角向量v的中間值。
    越多的微表面和半角向量對齊,那這個點的高光反射就越強越銳利。 
 
原理二 能量守恆 Energy conservation
    描述:出射光的能量不能超過入射光的能量(自發光除外)。所以光滑的表面反射光區域小強度高,粗糙的表面反射光區域大(分散)但更朦朧。
    為了能量守恆,我們需要將光區分為diffuse和specular,分開處理,因為這兩者是互斥的,能量來源都是入射光。
    reflection part 反射部分:specular lighting
    refraction part 折射部分:diffuse lighting,折射部分的光線會進入物體內部繼續傳播。
    物質可以看成是由無數個很小的particles組成(微觀),光線在碰到這些particle時,一部分能量被吸收轉化為熱能(能量損失),一部分被反射后繼續傳播(方向隨機的散射),直到能量損失耗盡或離開物體表面繼續傳播。而逃出物質表面繼續傳播的光線就成為了surface的diffuse color。 (light和particle碰撞時會有能量損耗)。 
  
  PBR對這個模型做了一個簡化:假設所有的折射光線要么被完全吸收,要么只會從一個很小的區域(同一個像素)散射出物體表面,而忽略那些在物體內部傳播然后從遠離入射點的地方散射出去的光線。
    次表面散射(SubSurface Scattering):SSS技術基於PBR並考慮了較遠距離散射的光線能量,顯著提升了表現效果,但也會帶來一些性能損耗。SSS材質一般用在皮膚、透光的大理石、蠟狀物的渲染模擬上。
    金屬材質(metallic):所有的refraction light都被直接吸收(轉化為熱能),而不會散射。所以金屬材質只有reflection light,沒有diffuse color。由於金屬材質的特殊性,在PBR的管線中,對於metallic和dielectrics(非金屬材質,電介質,絕緣體)的處理方式是不一樣的。
    能量守恆的表述:reflection和refraction是互斥的,所以我們先計算reflectec/specular的光照比例,然后剩下的就是refracted/diffuse的光照部分了。這樣能夠保證反射光和折射光都不可能超過1。 
    float kS = calculateSpecularComponent(...); // reflection/specular fraction
    float kD = 1.0 - kS;                        // refraction/diffuse  fraction
反射率方程 The reflectance equation
    渲染方程(Render Equation):用來模擬光的視覺效果最好的模型。
    反射率方程:物理渲染所使用的特定的渲染方程: 
    輻射度量學(Radiometry):是一種用來度量電磁場輻射的手段。
    Radiation:輻射
    Radiance:輻射率,用L表示,和反射率方程有關的一種輻射度量,用來度量某一方向上發射來的光線的大小或強度。
    還有很多輻射度量(radiometric quantities)用來測量曲面在某個方向上的光,我們只關注radiance。
    輻射通量(Radiant flux):Φ,感覺叫輻射流量更好理解,表示一個光源所輸出的能量,單位瓦特(Watts)。光是有多種不同波長的能量組合而成。
        函數表示:光源所包含的各種波長的一個函數。(可見光波長范圍390nm-700nm)。
        簡化表示:三原色RGB編碼(光色)。這個編碼有信息損失,但對於視覺上的影響可忽略不計。
    立體角(Solid Angle):ω,投射到單位球體上的一個截面的大小或面積。
    輻射強度(Radiant Intensity):I,單位球面上,一個光源向單位立體角所投射的輻射通量。
          輻射強度=輻射通量/立體角:
        輻射率(radiance):輻射強度Φ的光源在單位面積A、單位立體角w上輻射出的總能量: (輻射率方程The radiance euqation)
其中:float cosTheta = dot(lightDir, N);  
        輻射率(Radiance)是輻射度兩學上表示一個區域平面上光線總量的物理量。
        光束對單個像素的作用:立體角w和面積A看做無限小,實際上將立體角w轉變為方向向量w,面積A轉為點p。
     輻照度(Irradiance):所有投射到點p上的光線的總和。
        積分(Integral)的值等於一個函數曲線的面積。
        黎曼和(Riemann sum):在半球領域Ω中按一定步長將反射率方程分散求解,然后按照步長將結果平均化。 
        半球領域(Hemisphere):反射率方程概括了半球領域Ω內,照射到點p上的所有入射方向wi上的光線的輻射率,並受到fr的約束,然后返回觀察方向上反射光的Lo。
        IBL:利用一個環境貼圖來測算所有入射方向上的輻射率。 
 
原理三 BRDF Bidirectional Reflective Distribution Function 雙向反射分布函數
    作用:基於表面材質屬性來對入射輻射率進行縮放或者加權。依據微平面理論來近似求得材質的反射與折射屬性。
    輸入:入射方向wi,出射方向wo,平面發現n,微平面粗糙度α。
    輸出:近似的求出每束光線對一個給定了材質屬性的平面上最終反射出來的光線所作出的貢獻度。
    Blinn-Phong光照模型:采用wi和wo作為參數,可被認為是一個簡化的BRDF,但沒有遵守能量守恆。
    Cook-Torrance BRDF模型:主流BRDF,兼有漫反射和鏡面反射 
    公式解析:
        kd:入射光線中被折射部分的能量所占的比率
        ks:被反射部分的比率
        漫反射部分:Lambertian漫反射,據Epic的結論,Lambertian漫反射模型已足夠用: 
        鏡面反射部分:
        D:Normal Distribution Funcion,正態分布函數/法線分布函數,粗糙度相關
            微表面中與半角向量對齊的微平面的比例。
        F:Fresnel Rquation,菲涅爾方程,金屬度相關(通過金屬度計算反射率)
            在一個反射平面上,當入射角度越“傾斜”,反射的光線越多,折射的光線越少;入射角度越“直”折射越多,反射越少。該參數描述不同角度下的光線反射比率。
        G:Geometry Function,幾何函數,可見性函數,粗糙度相關
            描述了光線從入射到出射過程中,有多少比例被微平面自身的凹凸不平遮擋住了,也就是自陰影屬性。根據入射和出射方向,計算出不被自身遮擋的光線的比例。
     Epic Games的Unreal Engine 4采用的套餐:
        D:Trowbridge-Reitz GGX 
    float DistributionGGX(vec3 N, vec3 H, float a)
    {
        float a2     = a*a;
        float NdotH  = max(dot(N, H), 0.0);
        float NdotH2 = NdotH*NdotH;
        
        float nom    = a2;
        float denom  = (NdotH2 * (a2 - 1.0) + 1.0);
        denom        = PI * denom * denom;
        
        return nom / denom;
    }

        F:Fresnel-Schlick近似(Fresnel-Schlick Approximation)
            Fresnel equation是一個相當復雜的公式,不過我們可以使用Fresnel-Schlick公式來近似: 
            F0表示平面的基礎反射率(Base Reflectivity),可以使用IOR(Indices of Refraction,折射指數)計算得出。
            菲涅爾現象:理論上,任何表面從完美的90度(垂直於法線)看,都會完全地反射光線(很強)。越是從掠角上看菲涅爾現象就越是明顯,反光就越強。
            grazing andle:掠角。
            金屬材質的特殊性:對於導體,使用IOR計算出的F0並不准確。
            材質基礎反射率查詢網站: https://refractiveindex.info/
            電介質材質:基礎反射率不會高於0.17。
            導體材質(金屬):基礎反射率大多在0.5-1.0之間,而且一般會帶有顏色,所以 F0需要用RGB三原色表示
            由於金屬與非金屬的差異,所以引入了 金屬工作流(metallic workflow),材質引入金屬度(metalness)屬性,用來表示一個材質是金屬還是非金屬。 
    vec3 F0 = vec3(0.04);
    F0      = mix(F0, surfaceColor.rgb, metalness);

            非金屬:取0.04,多數情況下已經夠用,物理可信。
            金屬:取顏色紋理作為基礎反射率。(金屬會吸收所有折射光線,而沒有漫反射)。 
    vec3 fresnelSchlick(float cosTheta, vec3 F0)
    {
        return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0);
    }

           cosTheta:法線n與觀察方向v的點乘結果。
        G:Smith's Schlick-GGX
            Schlick-GGX:GGX與Schlick-Beckmann近似的結合體
            參數k是粗糙度α的轉化,在計算直接光照和IBL光照時算法不同:
            為了有效地模擬幾何遮擋,我們需要同時考慮:
                geometry obstruction:幾何遮蔽,視線方向遮擋
                geometry shadowing:幾何陰影,光線照射方向遮擋
            使用史密斯法(Smith's method): 
            取值范圍0.0-1.0,1.0表示沒有微平面陰影,0.0表示完全遮蔽。
    float GeometrySchlickGGX(float NdotV, float k)
    {
        float nom   = NdotV;
        float denom = NdotV * (1.0 - k) + k;

        return nom / denom;
    }

    float GeometrySmith(vec3 N, vec3 V, vec3 L, float k)
    {
        float NdotV = max(dot(N, V), 0.0);
        float NdotL = max(dot(N, L), 0.0);
        float ggx1 = GeometrySchlickGGX(NdotV, k);
        float ggx2 = GeometrySchlickGGX(NdotL, k);

        return ggx1 * ggx2;
    }

    基於Cook-Torrance BRDF的反射率方程:
        上面的公式並不完全正確,我們會發現其中的F表示光線在表面上的反射比率,而ks也是同樣的物理意義,所以高光反射部分的DFG中已經隱式包含了這個反射比率的物理意義,那么我們的反射率方程的最終形態應該是這樣:
    
        這個公式就是我們所說的PBR模型正確形態。 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM