【光照】Unity中的[物理模型]PBR
【從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應用?:
- 粗糙度參數
α = roughness2控制高光擴散 - 粗糙度高→微表面法線分散→寬泛柔和高光
- 粗糙度參數
-
??? 幾何遮蔽 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開始探索游戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,??)

本文深入解析了PBR(基于物理渲染)與BRDF(雙向反射分布函數)的核心原理及在Unity URP中的應用。PBR通過物理可測量的材質屬性(金屬度/粗糙度)和微表面理論實現真實感渲染,其四大支柱包括材質參數系統、微表面理論、能量守恒和線性工作流。BRDF作為PBR的數學基礎,通過GGX法線分布、菲涅爾項等計算光線交互。文章詳細對比了傳統光照模型與PBR+BRDF的本質區別,并提供了URP中BRDF.hlsl的關鍵實現代碼(如GGX分布函數和Schlick菲涅爾近似),展示了PBR如何通過整合直接光照與IBL
浙公網安備 33010602011771號