首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理PBR中GGX分布项的爆破?

如何处理PBR中GGX分布项的爆破?
EN

Stack Overflow用户
提问于 2022-01-03 11:39:46
回答 1查看 233关注 0票数 1

我正在学习PBR和统一标准着色器。GGX分布项的巨大结果使我感到困惑。

统一标准着色器使用GGX发行术语:

代码语言:javascript
复制
// 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,那么这个大反射能量似乎不符合能量守恒定律。我想反射的能量肯定比这次事件要小。

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

EN

回答 1

Stack Overflow用户

发布于 2022-01-03 20:12:30

在这里,Khronos glTF示例查看器可能可以作为额外的参考。

看起来您已经实现了D()术语,它是BRDF着色器的示例查看器第41 - 46行的实现

但这并不是完全的镜面术语。该函数被进一步向下调用,作为第108-115行的specularGGX的一部分。在用作镜面值之前,您所得到的结果与其他几个术语混合在一起。

glTF规范,B.3节中有一些关于这一点的进一步阅读。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70565251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档