【光照】[PBR][幾何遮蔽]實(shí)現(xiàn)方法對(duì)比
【從UnityURP開始探索游戲渲染】專欄-直達(dá)
幾何遮蔽的基本流程
幾何遮蔽(G)在BRDF中用于模擬微表面間的自陰影和遮蔽效應(yīng),其計(jì)算流程通常分為三個(gè)步驟:
- ?遮蔽項(xiàng)計(jì)算?:光線入射方向的遮擋概率
- ?陰影項(xiàng)計(jì)算?:視線方向的遮擋概率
- ?聯(lián)合計(jì)算?:將兩者結(jié)合形成完整的幾何函數(shù)
主要幾何遮蔽模型
1. Cook-Torrance模型
?原理?:
- 基于V形微槽假設(shè)
- 使用簡(jiǎn)單的min函數(shù)計(jì)算遮蔽和陰影
?公式?:
$G_{Cook-Torrance}=min?(1,\frac{2(n?h)(n?v)}{v?h},\frac{2(n?h)(n?l)}{v?h})$
?特點(diǎn)?:
- 計(jì)算簡(jiǎn)單但不夠精確
- 在掠射角表現(xiàn)不佳
2. Smith模型
?原理?:
- 將幾何項(xiàng)分解為獨(dú)立的遮蔽和陰影項(xiàng)
- 假設(shè)微表面高度服從統(tǒng)計(jì)分布
?公式?:
$G_{Smith}=G_1(v)?G_1(l)$
?Unity URP選擇?:
hlsl
// URP中Smith聯(lián)合Schlick-GGX實(shí)現(xiàn)
float V_SmithGGX(float NdotL, float NdotV, float roughness)
{
float a = roughness;
float a2 = a * a;
float GGXV = NdotL * sqrt(NdotV * NdotV * (1.0 - a2) + a2);
float GGXL = NdotV * sqrt(NdotL * NdotL * (1.0 - a2) + a2);
return 0.5 / max((GGXV + GGXL), 0.000001);
}
?選擇原因?:
- 與GGX法線分布完美匹配
- 能量守恒性更好
- 計(jì)算效率較高
3. Schlick近似模型
?原理?:
- 對(duì)Smith模型的快速近似
- 使用有理函數(shù)替代復(fù)雜計(jì)算
?公式?:
$G_{Schlick}(n,v)=\frac{n?v}{(n?v)(1?k)+k},k=\frac{(α+1)^2}8$
?特點(diǎn)?:
- 適合移動(dòng)端等性能受限平臺(tái)
- 精度略低于完整Smith模型
4. Kelemen-Szirmay-Kalos模型
?原理?:
- 基于微表面斜率分布
- 特別適合各向異性材質(zhì)
?公式?:
$G_{KSK}=\frac1{1+Λ(v)+Λ(l)}$
?應(yīng)用場(chǎng)景?:
- 頭發(fā)、織物等特殊材質(zhì)渲染
Unity URP的實(shí)現(xiàn)方案
選擇方案:Smith-Joint-Schlick-GGX
?實(shí)現(xiàn)代碼?:
hlsl
// Packages/com.unity.render-pipelines.universal/ShaderLibrary/BRDF.hlsl
float V_SmithJointGGX(float NdotL, float NdotV, float roughness)
{
float a2 = roughness * roughness;
float lambdaV = NdotL * (NdotV * (1.0 - a2) + a2);
float lambdaL = NdotV * (NdotL * (1.0 - a2) + a2);
return 0.5 / (lambdaV + lambdaL + 1e-5f);
}
?選擇原因?:
- ?物理準(zhǔn)確性?:
- 與GGX NDF保持?jǐn)?shù)學(xué)一致性
- 滿足能量守恒和互易性
- ?視覺質(zhì)量?:
- 在掠射角產(chǎn)生自然的陰影衰減
- 粗糙材質(zhì)表現(xiàn)更真實(shí)
- ?性能平衡?:
- 相比完整Smith模型減少30%計(jì)算量
- 移動(dòng)端友好(無復(fù)雜數(shù)學(xué)函數(shù))
- ?材質(zhì)一致性?:
- 與金屬/粗糙度工作流完美配合
- 參數(shù)響應(yīng)線性度好
優(yōu)化技術(shù)
-
?預(yù)計(jì)算部分項(xiàng)?:
hlsl // 預(yù)計(jì)算粗糙度平方 float a2 = roughness * roughness; -
?數(shù)值穩(wěn)定性處理?:
hlsl // 避免除零錯(cuò)誤 return 0.5 / (lambdaV + lambdaL + 1e-5f); -
?移動(dòng)端簡(jiǎn)化版?:
hlsl #if defined(SHADER_API_MOBILE) float V_SmithMobile(float NdotL, float NdotV, float roughness) { float a = roughness; float GGXV = NdotL * (NdotV * (1.0 - a) + a); float GGXL = NdotV * (NdotL * (1.0 - a) + a); return 0.5 / (GGXV + GGXL); } #endif
各模型性能對(duì)比
| 模型 | 指令數(shù) | 特殊函數(shù) | 移動(dòng)端適用性 | 視覺質(zhì)量 |
|---|---|---|---|---|
| Cook-Torrance | 8 | 無 | ★★★★☆ | ★★☆☆☆ |
| Smith完整版 | 15+ | sqrt | ★★☆☆☆ | ★★★★☆ |
| Smith-Schlick | 10 | 無 | ★★★★☆ | ★★★☆☆ |
| URP實(shí)現(xiàn) | 12 | sqrt | ★★★☆☆ | ★★★★☆ |
| Kelemen | 18+ | 復(fù)雜運(yùn)算 | ★☆☆☆☆ | ★★★★★ |
Unity URP的選擇在視覺質(zhì)量和計(jì)算開銷之間取得了最佳平衡,特別是考慮到現(xiàn)代GPU的架構(gòu)特性(SIMD執(zhí)行),即使包含sqrt運(yùn)算也不會(huì)造成顯著性能瓶頸。
【從UnityURP開始探索游戲渲染】專欄-直達(dá)
(歡迎點(diǎn)贊留言探討,更多人加入進(jìn)來能更加完善這個(gè)探索的過程,??)

摘要:文章介紹了Unity URP渲染管線中的幾何遮蔽(G)計(jì)算流程,重點(diǎn)分析了幾種主流幾何遮蔽模型的特點(diǎn)和實(shí)現(xiàn)方案。URP采用Smith-Joint-Schlick-GGX模型,在物理準(zhǔn)確性、視覺質(zhì)量和性能之間取得平衡,既保證了與GGX法線分布的一致性,又通過優(yōu)化技術(shù)(如預(yù)計(jì)算、數(shù)值穩(wěn)定性處理)提升執(zhí)行效率。文章還對(duì)比了Cook-Torrance、Smith完整版等模型的優(yōu)缺點(diǎn),說明URP選擇該方案的原因,包括滿足能量守恒、移動(dòng)端友好等特性,為游戲渲染提供了優(yōu)質(zhì)解決方案。
浙公網(wǎng)安備 33010602011771號(hào)