Stories

Detail Return Return

【光照】Unity中的[物理模型]PBR - Stories Detail

【從UnityURP開始探索遊戲渲染】專欄-直達

PBR(Physically Based Rendendering)的核心內容與BRDF應用‌

PBR是一種基於物理光學原理的渲染框架,其核心是通過‌物理可測量的材質屬性‌和‌真實的光照計算規則‌實現跨環境一致的真實感渲染。


‌PBR四大核心支柱‌

模塊 作用 關鍵參數
材質參數系統 定義物體固有光學屬性 金屬度(Metallic)粗糙度(Roughness)基礎反射率(Albedo)
微表面理論 描述微觀幾何對光的影響 法線分佈(NDF)幾何遮蔽(G)菲涅爾(F)
能量守恆約束 確保物理正確性 漫反射+鏡面反射≤入射光能
線性工作流 模擬真實光強度 HDR環境光照伽馬校正

BRDF和PBR的關係

BRDF(雙向反射分佈函數)與PBR(基於物理的渲染)是計算機圖形學中緊密關聯的兩個概念.

理論層級關係

  • BRDF是PBR的數學基礎

    BRDF通過微表面理論(Microfacet Theory)描述光線與物體表面的交互,定義了入射光方向(ωi)與出射光方向(ωo)的反射比例關係‌。

    PBR則基於BRDF構建完整的渲染流程,通過物理參數(如粗糙度、金屬度)實現真實材質模擬‌。

  • PBR的三大核心條件

    • 微表面理論(BRDF的物理基礎)
    • 能量守恆(BRDF需滿足反射率≤1)
    • 基於物理的BRDF(如Cook-Torrance模型)‌

技術實現差異

特性 BRDF PBR
作用範圍 局部反射計算(單點光照) 全局渲染流程(含IBL、陰影等)
參數化 數學函數(如GGX、Schlick) 材質系統(URP/Standard Shader)
物理準確性 高(需滿足能量守恆) 更高(整合多物理效應)

Unity中的實際應用

  • BRDF實現
    • URP的BRDF.hlsl文件包含GGX法線分佈、菲涅爾項等核心計算‌。
    • 示例:BRDF_Unity_PBS函數組合漫反射與鏡面反射‌。
  • PBR流程
    • 通過Lighting.hlsl整合BRDF與IBL(環境光遮蔽)‌。
    • 材質參數(如_Metallic)直接控制BRDF行為‌。

演進與擴展

  • 從BRDF到PBR‌:BRDF解決了Phong模型非物理問題,PBR進一步擴展至全局光照(如IBL)和材質系統‌。
  • 現代應用‌:URP/Standard Shader均採用PBR流程,但底層仍依賴BRDF的數學實現‌

BRDF(PBR)實現

核心腳本

  • BRDF.hlsl(路徑:Packages/com.unity.render-pipelines.universal/ShaderLibrary/
  • 關鍵類:BRDFData(存儲粗糙度、金屬度等參數)和Lighting.hlsl(處理光照計算)

實現方法

  • GGX法線分佈函數‌:

    hlsl
    float D_GGX(float NdotH, float roughness) {
        float a = roughness * roughness;
        return a / (PI * pow((NdotH * NdotH * (a - 1.0) + 1.0), 2.0));
    }
    
  • 菲涅爾項 Schlick近似‌:其中F0為基礎反射率(金屬材質為0.9,非金屬為0.04)

    hlsl
    float3 F_Schlick(float3 F0, float VdotH) {
        return F0 + (1.0 - F0) * pow(1.0 - VdotH, 5.0);
    }
    

調用流程

  • 在Shader中通過#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"引入
  • 最終調用BRDF_Unity_PBS函數組合漫反射和鏡面反射

自定義擴展

  • 新增光照模型
    • 修改StencilUsage.cs定義新的Stencil值(如MaterialCustom
    • GBufferPass.cs中添加對應Shader Tag和Stencil寫入邏輯
  • 參數調整
    • 標準光照模型:通過Material面板調整_Specular_Glossiness
    • BRDF模型:調整_Metallic_Smoothness參數

對比總結

特性 標準光照模型 BRDF模型
實現文件 SimpleLit.shader BRDF.hlsl + Lighting.hlsl
核心函數 UniversalFragmentBlinnPhong BRDF_Unity_PBS
物理準確性 低(經驗模型) 高(微表面理論)

如需深度定製,建議參考URP官方Shader庫中的Lighting.hlslBRDF.hlsl實現

‌BRDF在PBR中的具體應用‌

PBR通過分解BRDF實現光照計算,以下是各部分的實現原理:

‌鏡面反射計算(Cook-Torrance BRDF)

PBR直接調用BRDF的微表面模型:

$f_{spec}=\frac{F⋅D⋅G}{4(n⋅ω_i)(n⋅ω_o)}$

  • 🔴 菲涅爾項 F

    基於Schlick近似:

    $F = F_0 + (1 - F_0)(1 - \cos\theta)^5$

    PBR應用‌:

    • $F_0$由金屬度控制(金屬=Albedo,非金屬=0.04)
    • 掠射角反射增強自動實現(如水面倒影隨視角變化)
  • 🔵 法線分佈 D

    GGX模型‌(主流選擇):

    $D = \frac{\alpha_g2}{\pi[(n·h)2(\alpha_g2-1)+1]2}$

    PBR應用‌:

    • 粗糙度參數α = roughness²控制高光擴散
    • 粗糙度高→微表面法線分散→寬泛柔和高光
  • 🟢 幾何遮蔽 G

    Smith聯合遮蔽函數:

    $G = \frac{n·\omega_i}{n·\omega_i + k} · \frac{n·\omega_o}{n·\omega_o + k}$

    PBR應用‌:

    • $k = (roughness + 1)^2 / 8$ 控制自陰影
    • 防止粗糙表面邊緣過亮(如磨損金屬稜角)

漫反射計算

採用‌能量守恆型Lambert模型‌:

$f_{diff}=\frac{albedo}{π}⋅(1−F)⋅(1−metallic)$

PBR優化‌:

  • 金屬度metallic=1時漫反射歸零(純金屬無漫反射)
  • (1-F)確保未被鏡面反射的光才參與漫反射

‌環境光照(IBL)

PBR將BRDF擴展到環境光:

技術 作用 BRDF整合方式
輻照度圖 漫反射環境光 對BRDF的cos項半球積分
預濾波環境圖 鏡面反射環境光 按粗糙度預過濾GGX分佈
BRDF LUT 菲涅爾補償 存儲∫fspecdωi∫fspecdωi預積分結果

‌PBR渲染流程中的BRDF調用‌

典型PBR着色器代碼結構(Unity URP示例):

hlsl
// 輸入參數
float3 albedo = baseColor.rgb;
float metallic = params.x;
float roughness = params.y;

// 1. 計算直接光照BRDF
float3 F0 = lerp(0.04, albedo, metallic); // 基礎反射率
float3 directLight = 0;
foreach (Light light in sceneLights) {
    float3 H = normalize(V + L);
    float NdotV = dot(N, V);
    float NdotL = dot(N, L);

    // BRDF計算
    float3 F = FresnelSchlick(max(dot(H, V), 0.0), F0);
    float D = NDF_GGX(roughness, N, H);
    float G = GeometrySmith(roughness, NdotV, NdotL);

    float3 kS = F; // 鏡面反射比例
    float3 kD = (1 - F) * (1 - metallic); // 漫反射比例

    // Cook-Torrance BRDF
    float3 specularBRDF = (F * D * G) / max(4.0 * NdotV * NdotL, 0.001);
    float3 diffuseBRDF = kD * albedo / PI;

    directLight += (diffuseBRDF + specularBRDF) * lightColor;
}

// 2. 應用IBL環境BRDF
float3 envDiffuse = texture(irradianceMap, N).rgb * albedo;
float3 R = reflect(-V, N);
float3 envSpecular = textureLod(prefilterMap, R, roughness * MAX_LOD).rgb;
float2 envBRDF = texture(BRDF_LUT, float2(NdotV, roughness)).rg;
float3 iblSpecular = envSpecular * (F0 * envBRDF.x + envBRDF.y);

// 3. 組合結果(能量守恆)
float3 result = (directLight + envDiffuse + iblSpecular) * aoMap;

‌PBR與傳統渲染的本質區別‌

特性 傳統光照模型 PBR+BRDF
參數意義 人工經驗值 物理可測量屬性
高光控制 獨立高光強度參數 粗糙度+金屬度推導
環境響應 環境貼圖簡單疊加 IBL精確匹配BRDF
一致性 不同光照需重調參數 一次校準全場景適用

‌案例説明:金屬銅材質‌

  • 材質參數‌:

    albedo = (0.95, 0.64, 0.54)(銅色)

    metallic = 0.98

    roughness = 0.3

  • BRDF作用‌:

    • 菲涅爾項F:掠射角反射增強至金色
    • GGX分佈D:中等粗糙度產生柔化高光邊緣
    • 幾何遮蔽G:表面微小凹痕產生陰影細節
    • IBL:環境中的暖色光自然融入反射

🔍 ‌效果對比‌:傳統Phong模型會顯示均勻橙色+圓形高光,而PBR+BRDF呈現真實的金屬漸變反射和表面微結構細節。

PBR通過系統化應用BRDF的物理光學模型,實現了材質表達的客觀性和光照響應的真實性,成為現代3A遊戲與影視渲染的工業標準。


【從UnityURP開始探索遊戲渲染】專欄-直達

(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)

Add a new Comments

Some HTML is okay.