1

我开始向我的游戏引擎添加延迟着色,我在理解如何从深度纹理中检索眼睛空间坐标时遇到了一些麻烦。

根据我的理解,我在这篇文章中阅读了两种方法:

  • 如果我将深度存储在GL_DEPTH_ATTACHMENT我的帧缓冲区中,第一种方法将起作用。
  • 第二种方法需要我在 Shader 中计算我的深度,并将其存储在GL_COLOR_ATTACHMENTn.

第二种方法的重建对于我需要的东西来说似乎太复杂了,所以如果可能的话,我宁愿不使用它。

对于重建眼睛坐标,第一种方法取 a 中的纹理坐标、深度和 a ,w将其乘以逆透视矩阵,然后将结果除以它的。1.0vec4w

这种方法是否会在我的GL_DEPTH_ATTACHMENT纹理中存储的深度不变的情况下工作,并且它是否足够准确以进行照明?

如果它不能原封不动地工作,那么我需要用我的深度做什么才能让它发挥作用?

4

1 回答 1

1

您可能会在着色器中计算深度并将其存储在颜色缓冲区中的原因是深度缓冲区是非线性的。由于透视校正,您必须对采样的深度值执行额外的操作才能获得线性深度(您想要用于视图/世界空间位置重建)。

写一个线性值作为解决方案很诱人gl_FragDepth,我已经看到一些教程甚至这样做......但不要这样做!它破坏了现代硬件深度缓冲优化,如分层 z 缓冲和早期深度测试。

您指出的第二种方法不仅不必要地复杂,而且效率极低。您最好在重建期间简单地线性化非线性深度缓冲区。在创建 G 缓冲区期间,一些额外的片段着色器指令应该比将深度写入两个位置(隐式写入深度缓冲区,加上一个专用颜色缓冲区)更快。

于 2013-10-31T17:50:24.827 回答