渲染中的光照著色方式:PBR(Physically Based Rendering,物理基礎渲染)與 傳統經驗渲染

JeasonBoy發表於2024-06-18

參考《Unity Shader 入門精要》十八章 基於物理的渲染

與PBR(Physically Based Rendering,物理基礎渲染)對應的渲染方法通常被稱為“傳統渲染”或“基於經驗的渲染”(Empirical Rendering)。以下是兩者的主要區別:

傳統渲染

傳統渲染方法基於經驗規則和藝術調整,而不是物理定律。這種方法主要依賴於開發人員和藝術家的直覺和經驗,透過調整各種引數和技巧來實現所需的視覺效果。

特點

  1. 經驗法則

    • 傳統渲染方法依賴於經驗法則和藝術調整,而非嚴格的物理模擬。
  2. 簡單的光照模型

    • 使用簡單的光照模型,如 Phong 著色模型、Blinn-Phong 著色模型和 Lambert 著色模型。
  3. 不一定遵循能量守恆

    • 光照計算不一定遵循能量守恆原則,可能導致非物理的光照效果。
  4. 容易實現和調整

    • 實現相對簡單,適用於硬體效能有限或開發週期較短的專案。

常見的傳統著色模型

  1. Phong 著色模型

    • 計算出每個頂點的顏色,並在片元(畫素)階段進行插值。
  2. Blinn-Phong 著色模型

    • Phong 模型的改進版,引入了半形向量以簡化計算。
  3. Lambert 著色模型

    • 僅考慮漫反射光。

PBR(Physically Based Rendering,物理基礎渲染)是一種計算機圖形學技術,用於實現更加逼真和一致的光照效果。PBR 透過模擬光與物體表面相互作用的物理原理,生成更加真實的影像。PBR 著色模型的核心理念是將物理屬性作為基礎,結合環境光和材質屬性,計算出最終的光照效果。

PBR 的基本概念

PBR 基於以下幾個核心概念:

  1. BRDF(雙向反射分佈函式)

    • BRDF 描述了光線如何從表面反射。常用的 BRDF 模型包括 Lambertian(用於漫反射)和 Cook-Torrance(用於鏡面反射)。
  2. 能量守恆

    • PBR 著色模型遵循能量守恆原理,即反射的光線總能量不會超過入射光線的總能量。
  3. 微表面理論

    • 微表面理論假設表面由許多微小的面片組成,這些面片的法線方向分佈決定了光的反射特性。

PBR 的材質屬性

PBR 著色通常使用以下幾種材質屬性:

  1. Albedo(反照率)

    • 表示表面的基礎顏色,不包含任何光照資訊。
  2. Metalness(金屬度)

    • 表示材質的金屬性質。金屬材質的金屬度為1,非金屬材質的金屬度為0。金屬材質通常會影響表面的反射特性和顏色。
  3. Roughness(粗糙度)

    • 描述表面的光滑程度。粗糙度為0表示完全光滑的表面,粗糙度為1表示完全粗糙的表面。粗糙度會影響高光的擴散程度。
  4. Normal(法線)

    • 用於表示表面的法線方向,影響光線的反射和折射。
  5. Ambient Occlusion(環境光遮蔽)

    • 表示表面的自陰影效果,用於模擬小範圍內的光線遮蔽。
  6. Specular(鏡面反射)

    • 用於非金屬材質,表示鏡面反射的顏色和強度。

PBR 著色模型

常見的 PBR 著色模型包括:

  1. 金屬/粗糙度(Metallic/Roughness)

    • 使用 Albedo、Metalness 和 Roughness 等屬性。
    • Unity 標準著色器使用的就是這種模型。
  2. 鏡面/光滑度(Specular/Glossiness)

    • 使用 Albedo、Specular 和 Glossiness 等屬性。

Unity 中的 PBR

在 Unity 中,可以使用標準著色器(Standard Shader)實現 PBR。Unity 標準著色器支援金屬/粗糙度模型,可以透過材質屬性皮膚設定相關引數。

物理基礎渲染(PBR)的理論和數學實現基於模擬光線與物體表面相互作用的物理原理。PBR的核心是BRDF(雙向反射分佈函式),它描述了入射光線和反射光線之間的關係。以下是PBR的理論基礎和數學實現的詳細介紹。

PBR 的理論基礎

1. 能量守恆

PBR 遵循能量守恆原理,即反射的光線總能量不會超過入射光線的總能量。反射光和吸收光之和等於入射光。

2. 微表面理論

微表面理論假設表面由許多微小的面片組成,這些面片的法線方向分佈決定了光的反射特性。

3. Fresnel 效應

Fresnel 效應描述了反射光的強度隨著觀察角度的變化而變化。對於金屬材質,反射光顏色與材質顏色相關;對於非金屬材質,反射光為白色。

4. Cook-Torrance BRDF

Cook-Torrance BRDF 是一種常用的 BRDF 模型,它由三部分組成:Fresnel 項、幾何項和微表面法線分佈項。

PBR 的數學實現

1. Cook-Torrance BRDF

Cook-Torrance BRDF 用於計算反射光的強度和顏色。其公式如下:

2. Fresnel 項

Fresnel 項描述了反射光的強度隨著觀察角度的變化:

3. 幾何遮蔽項

幾何遮蔽項描述了光線被遮蔽的程度:

4. 微表面法線分佈項

微表面法線分佈項描述了表面微法線的分佈:

PBR 著色器示例

以下是一個使用 Cook-Torrance BRDF 的 Unity 著色器示例:

Shader "Custom/PBRShader"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
        _Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5
        _NormalMap("Normal Map", 2D) = "bump" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows

        sampler2D _MainTex;
        sampler2D _BumpMap;
        half _Metallic;
        half _Glossiness;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

        void surf(Input IN, inout SurfaceOutputStandard o)
        {
            half4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
        }
        ENDCG
    }
    FallBack "Diffuse"
}

具體的實現步驟

  1. 計算半形向量

    float3 halfVector = normalize(lightDir + viewDir);
  2. 計算 Fresnel 項

    float3 F = F0 + (1.0 - F0) * pow(1.0 - dot(viewDir, halfVector), 5.0);
  3. 計算幾何遮蔽項

    float G = G_Smith(normal, viewDir, lightDir, roughness);
  4. 計算微表面法線分佈項

    float D = D_GGX(normal, halfVector, roughness);
  5. 計算 Cook-Torrance BRDF

    float3 specular = (D * G * F) / (4 * dot(normal, lightDir) * dot(normal, viewDir));

透過這些步驟,可以實現 PBR 的核心計算,並將結果用於最終的光照計算,從而生成逼真的光照效果。

總結

PBR(物理基礎渲染)基於模擬光線與物體表面相互作用的物理原理,透過 BRDF(特別是 Cook-Torrance BRDF)實現更為逼真的光照效果。PBR 的核心概念包括能量守恆、微表面理論和 Fresnel 效應,其數學實現涉及 Fresnel 項、幾何遮蔽項和微表面法線分佈項。透過這些理論和數學模型,可以在遊戲和圖形應用中實現高度逼真的材質和光照效果。

相關文章