【从UnityURP开始探索游戏渲染】专栏-直达
Beckmann分布函数原理
Beckmann分布函数是最早用于微表面模型的法线分布函数之一,由Paul Beckmann在1963年的光学研究中首次提出。它描述了表面微平面法线分布的统计规律,是计算机图形学中最早的物理准确NDF实现。
数学原理
Beckmann分布函数的标准形式为:
$D_{Beckmann}(h)=\frac1{πm2(n⋅h)4}exp(−\frac{{(tanθ_h)}2}{m2})$
其中:
- h:半角向量
- n:宏观表面法线
- θ_h:h与n之间的夹角
- m:表面粗糙度参数(RMS斜率)
在BRDF实现中通常表示为:- hlsl
- float D_Beckmann(float NdotH, float roughness)
- {
- float m = roughness * roughness;
- float m2 = m * m;
- float NdotH2 = NdotH * NdotH;
- float tan2 = (1 - NdotH2) / max(NdotH2, 0.004);
- float expTerm = exp(-tan2 / m2);
- return expTerm / (PI * m2 * NdotH2 * NdotH2);
- }
复制代码 特性分析
- 高斯分布基础:
- 基于表面高度服从高斯分布的假设
- 模拟光学粗糙表面的散射特性
- 物理准确性:
- 满足互易性和能量守恒
- 推导自物理表面的实际测量数据
- 各向异性扩展:
- hlsl
- float D_BeckmannAnisotropic(float NdotH, float HdotX, float HdotY, float ax, float ay)
- {
- float tan2 = (HdotX*HdotX)/(ax*ax) + (HdotY*HdotY)/(ay*ay);
- return exp(-tan2) / (PI * ax * ay * NdotH * NdotH * NdotH * NdotH);
- }
复制代码 Unity URP放弃Beckmann的原因
虽然Beckmann是物理准确的分布函数,Unity URP选择GGX作为默认NDF有多个重要原因:
视觉质量对比
特性BeckmannGGX高光核心尖锐集中柔和自然衰减尾部快速衰减$(e{−x2})$长尾分布$\frac1{(1+x^2)}$材质表现塑料感强金属感真实掠射角响应过度锐利平滑过渡物理准确性差异
真实材质测量:
- GGX更符合实际测量的材质反射特性
- 特别是金属和粗糙表面,GGX的长尾分布更准确
- Disney Principled BRDF研究证实GGX的优越性
能量守恒对比:
[code]hlsl// Beckmann的能量损失测试float energyLoss = 0;for(float i=0; i |