【问题标题】:How to deal with blow up of the GGX distribution term in PBR?如何处理 PBR 中 GGX 分配期限的爆炸?
【发布时间】:2022-01-03 11:39:46
【问题描述】:

我正在学习 PBR 和 Unity 标准着色器。 GGX 分布术语的真正大结果让我感到困惑。

Unity 标准着色器使用 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));
}

这是让我困惑的问题:

  1. 将 NdotH 设置为 1(观察方向正好在镜面反射方向)。
  2. 将粗糙度设置为较低的值,例如 0.015

GGX 项的结果是 868.58123。这是一个非常大的数字,使得最终的颜色远远大于1。BRDF中的所有其他项都小于1。如果入射光只是1,那么这个大的反射能量似乎不符合能量守恒定律。我认为反射的能量肯定比事件要小。

我知道我的理解一定有问题。感谢您的指导。

【问题讨论】:

    标签: rendering pbr


    【解决方案1】:

    Khronos glTF Sample Viewer 或许可以在这里作为额外的参考。

    您似乎已经实现了D() 术语,即BRDF 着色器的示例查看器implements on lines 41 - 46

    但这不是完整的镜面反射术语。作为function BRDF_specularGGX on lines 108 - 115 的一部分,该函数被进一步调用。在用作高光值之前,您得到的结果与其他几个术语混合在一起。

    the glTF specification, section B.3 对此有一些进一步的阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多