【從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函數組合漫反射與鏡面反射。
- URP的
- 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.hlsl和BRDF.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.98roughness = 0.3 -
BRDF作用:
- 菲涅爾項
F:掠射角反射增強至金色 - GGX分佈
D:中等粗糙度產生柔化高光邊緣 - 幾何遮蔽
G:表面微小凹痕產生陰影細節 - IBL:環境中的暖色光自然融入反射
- 菲涅爾項
🔍 效果對比:傳統Phong模型會顯示均勻橙色+圓形高光,而PBR+BRDF呈現真實的金屬漸變反射和表面微結構細節。
PBR通過系統化應用BRDF的物理光學模型,實現了材質表達的客觀性和光照響應的真實性,成為現代3A遊戲與影視渲染的工業標準。
【從UnityURP開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)