我开始在我的游戏引擎中添加延迟着色,我在理解如何从深度纹理中检索眼睛空间坐标时遇到一些麻烦。
我已经阅读了this post中的两个方法以及我的理解:
GL_DEPTH_ATTACHMENT
的深度存储到我的Framebuffer中,第一种方法将起作用。GL_COLOR_ATTACHMENTn
。第二种方法的重建对于我需要的东西来说似乎太复杂了,所以如果可能的话我宁愿不使用它。
为了重建眼睛坐标,第一种方法采用w
中的纹理坐标,深度和1.0
vec4
,将其乘以逆透视矩阵,然后将结果除以w
。
此方法是否会与我GL_DEPTH_ATTACHMENT
纹理中存储的深度保持一致,并且它是否足以准确点亮?
如果它无法正常工作,那么我需要做些什么才能让它发挥作用呢?
答案 0 :(得分:1)
您可以在着色器中计算深度并将其存储在颜色缓冲区中的原因是深度缓冲区是非线性的。由于透视校正,您必须对采样的深度值执行额外的操作才能获得线性深度(您想要进行视图/世界空间位置重建)。
将gl_FragDepth
的线性值写成一个解决方案是很诱人的,我已经看到一些教程甚至这样做了......但是不要这样做!它破坏了现代硬件深度缓冲区优化,如分层z缓冲和早期深度测试。
您指出的第二种方法不仅不必要地复杂化,而且效率也非常低。最好在重建期间简单地线性化非线性深度缓冲区。在创建G缓冲区期间,一些额外的片段着色器指令应该比将深度写入两个位置(隐式写入深度缓冲区,加上一个专用颜色缓冲区)更快。