參考《Unity Shader 入門精要》十八章 基於物理的渲染
與PBR(Physically Based Rendering,物理基礎渲染)對應的渲染方法通常被稱為“傳統渲染”或“基於經驗的渲染”(Empirical Rendering)。以下是兩者的主要區別:
傳統渲染
傳統渲染方法基於經驗規則和藝術調整,而不是物理定律。這種方法主要依賴於開發人員和藝術家的直覺和經驗,透過調整各種引數和技巧來實現所需的視覺效果。
特點
-
經驗法則:
- 傳統渲染方法依賴於經驗法則和藝術調整,而非嚴格的物理模擬。
-
簡單的光照模型:
- 使用簡單的光照模型,如 Phong 著色模型、Blinn-Phong 著色模型和 Lambert 著色模型。
-
不一定遵循能量守恆:
- 光照計算不一定遵循能量守恆原則,可能導致非物理的光照效果。
-
容易實現和調整:
- 實現相對簡單,適用於硬體效能有限或開發週期較短的專案。
常見的傳統著色模型
-
Phong 著色模型:
- 計算出每個頂點的顏色,並在片元(畫素)階段進行插值。
-
Blinn-Phong 著色模型:
- Phong 模型的改進版,引入了半形向量以簡化計算。
-
Lambert 著色模型:
- 僅考慮漫反射光。
PBR(Physically Based Rendering,物理基礎渲染)是一種計算機圖形學技術,用於實現更加逼真和一致的光照效果。PBR 透過模擬光與物體表面相互作用的物理原理,生成更加真實的影像。PBR 著色模型的核心理念是將物理屬性作為基礎,結合環境光和材質屬性,計算出最終的光照效果。
PBR 的基本概念
PBR 基於以下幾個核心概念:
-
BRDF(雙向反射分佈函式):
- BRDF 描述了光線如何從表面反射。常用的 BRDF 模型包括 Lambertian(用於漫反射)和 Cook-Torrance(用於鏡面反射)。
-
能量守恆:
- PBR 著色模型遵循能量守恆原理,即反射的光線總能量不會超過入射光線的總能量。
-
微表面理論:
- 微表面理論假設表面由許多微小的面片組成,這些面片的法線方向分佈決定了光的反射特性。
PBR 的材質屬性
PBR 著色通常使用以下幾種材質屬性:
-
Albedo(反照率):
- 表示表面的基礎顏色,不包含任何光照資訊。
-
Metalness(金屬度):
- 表示材質的金屬性質。金屬材質的金屬度為1,非金屬材質的金屬度為0。金屬材質通常會影響表面的反射特性和顏色。
-
Roughness(粗糙度):
- 描述表面的光滑程度。粗糙度為0表示完全光滑的表面,粗糙度為1表示完全粗糙的表面。粗糙度會影響高光的擴散程度。
-
Normal(法線):
- 用於表示表面的法線方向,影響光線的反射和折射。
-
Ambient Occlusion(環境光遮蔽):
- 表示表面的自陰影效果,用於模擬小範圍內的光線遮蔽。
-
Specular(鏡面反射):
- 用於非金屬材質,表示鏡面反射的顏色和強度。
PBR 著色模型
常見的 PBR 著色模型包括:
-
金屬/粗糙度(Metallic/Roughness):
- 使用 Albedo、Metalness 和 Roughness 等屬性。
- Unity 標準著色器使用的就是這種模型。
-
鏡面/光滑度(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" }
具體的實現步驟
-
計算半形向量:
float3 halfVector = normalize(lightDir + viewDir);
-
計算 Fresnel 項:
float3 F = F0 + (1.0 - F0) * pow(1.0 - dot(viewDir, halfVector), 5.0);
-
計算幾何遮蔽項:
float G = G_Smith(normal, viewDir, lightDir, roughness);
-
計算微表面法線分佈項:
float D = D_GGX(normal, halfVector, roughness);
-
計算 Cook-Torrance BRDF:
float3 specular = (D * G * F) / (4 * dot(normal, lightDir) * dot(normal, viewDir));
透過這些步驟,可以實現 PBR 的核心計算,並將結果用於最終的光照計算,從而生成逼真的光照效果。
總結
PBR(物理基礎渲染)基於模擬光線與物體表面相互作用的物理原理,透過 BRDF(特別是 Cook-Torrance BRDF)實現更為逼真的光照效果。PBR 的核心概念包括能量守恆、微表面理論和 Fresnel 效應,其數學實現涉及 Fresnel 項、幾何遮蔽項和微表面法線分佈項。透過這些理論和數學模型,可以在遊戲和圖形應用中實現高度逼真的材質和光照效果。