GameTech/URP 渲染实战

案例 9.3看见 G:遮蔽主要发生在哪里入门

目标:用案例 9.1 的 Shader 输出 G 项(_Mode = 1,高度相关形式),观察它随粗糙度的变化;再对比分离形式与高度相关形式的差别。

图 9-11只输出高度相关 Smith G(0 黑 ~ 1 白),感知粗糙度 0.1 → 0.9。右下方的黑色月牙是 n·l ≤ 0、背光的区域。粗糙度越大,越靠近轮廓和明暗交界线的地方越暗。

可以看到,即便在粗糙度 0.9,球的大部分区域 G 仍在 0.7 以上,遮蔽集中在轮廓(𝐧·𝐯 小)和明暗交界线(𝐧·𝐥 小)附近。这正是 G 的视觉作用:压暗粗糙物体边缘的高光。没有它,粗糙金属球的轮廓会出现一圈不自然的亮边。

图 9-12粗糙度 1.0、光从右侧射来。左:分离形式 G₁(l)·G₁(v);中:高度相关形式;右:两者之差放大 10 倍。差别集中在球的边缘(视线掠射)和明暗交界线(光线掠射),中心几乎为零。

两种形式的绝对差别不大(右图放大了 10 倍才看清),但它分布在边缘,恰好是高光最容易“闹事”的地方。HDRP、Filament 等较新的实现都使用高度相关形式;第 11 章手写 PBR 时我们也用它。

常见坑写 Smith G 时,最容易犯的错是把 α 和感知粗糙度搞混:Schlick-GGX 的 k 有好几个版本,有的以感知粗糙度为输入,有的以 α 为输入,照抄公式前要确认文献的约定。另一个坑是把 G 和 Cook-Torrance 分母重复计算——如果用的是 V 形式(已经除过 4(𝐧·𝐥)(𝐧·𝐯)),就不要再除一次。