GameTech/URP 渲染实战

案例 9.2GGX、Beckmann 与 Blinn-Phong 的长尾入门

目标:同一个 α,对比三种 NDF 在球面上的样子。

用案例 9.1 的 Shader,把 _NDF 分别设为 0、1、2,感知粗糙度 0.45(α≈0.2),Exp 显示、曝光 0.6:

Assets/Cookbook/Ch09/Editor/Ch09Shots.cs(节选:ndfshot)
[BookShot("ch09-ndf-compare", W = 420, H = 360, Panels = 3)]
static void NdfCompare(Shot s)
{
    var m = Terms(s, 0, 0.45f);
    m.SetFloat("_NDF", s.Panel);           // GGX / Beckmann / Blinn-Phong
    m.SetFloat("_Display", 1); m.SetFloat("_Exposure", 0.6f);
    Single(s, m, 30, 25);
}
图 9-8左:GGX;中:Beckmann;右:归一化 Blinn-Phong(n = 2/α² − 2)。三者亮核大小相近,但只有 GGX 在亮核外有一大圈逐渐变暗的光晕。

后两张几乎一模一样,这说明 Blinn-Phong 高光只要做了归一化、选对了指数,本质上就是 Beckmann 的廉价替身。很多老游戏里的“Normalized Blinn-Phong”能撑起相当不错的画面,原因就在这里。真正的视觉差别来自 GGX 的长尾。

调参建议想让高光“更锐利、没有光晕”的风格化材质,可以考虑换用 Beckmann 或归一化 Blinn-Phong;想要更接近真实金属的效果,用 GGX。第 12 章还会介绍“两个 GGX 叶片混合”等进一步控制高光形状的手法。