我正在学习PBR和统一标准着色器。GGX分布项的巨大结果使我感到困惑。
统一标准着色器使用GGX发行术语:
// I re-write it into C#
private float GGXTerm(float NdotH, float roughness)
{
float a2 = roughness * roughness;
float d = (NdotH * a2 - NdotH) * NdotH + 1.0f;
return a2 / (Mathf.PI * (d * d + 1e-7f));
}这个问题让我很困惑:
GGX项的结果为868.58123。这是一个非常大的数字,使得最终颜色比1更大。BRDF中的所有其他项都小于1。如果入射光只有1,那么这个大反射能量似乎不符合能量守恒定律。我想反射的能量肯定比这次事件要小。
我知道我的理解一定有问题。谢谢你的指导。
发布于 2022-01-03 20:12:30
在这里,Khronos glTF示例查看器可能可以作为额外的参考。
看起来您已经实现了D()术语,它是BRDF着色器的示例查看器第41 - 46行的实现。
但这并不是完全的镜面术语。该函数被进一步向下调用,作为第108-115行的specularGGX的一部分。在用作镜面值之前,您所得到的结果与其他几个术语混合在一起。
在glTF规范,B.3节中有一些关于这一点的进一步阅读。
https://stackoverflow.com/questions/70565251
复制相似问题