在深度测试的同时阅读FBO深度附件

时间:2015-07-23 00:12:12

标签: opengl opengl-3 fbo depth-buffer

我使用OpenGL 3.3处理延迟渲染引擎。我有一个FBO设置为我的G缓冲区,纹理附加为深度组件。

在我的光照传递中,我需要深度测试(禁用写入)来剔除不必要的像素。但是,我目前正在编写将重建世界位置坐标的代码,这也需要访问深度缓冲区。

在Opengl 3.3中将深度附件绑定到纹理单元并对其进行采样,同时在相同的通道中使用它进行深度测试是否合法?

我无法在文档中找到任何具体的内容,但我的直觉告诉我,为两个不同的目的使用相同的缓冲区/纹理会产生未定义的行为。有人知道吗?我有一套有限的硬件可以测试,并且不想对什么有效做出错误的假设。

1 个答案:

答案 0 :(得分:2)

至少这会造成一种无法保证记忆一致性的情况(在GL4之前的传统管道的所有阶段都会考虑一致性,并且没有标准化控制)。

驱动程序可能会以不合需要的方式缓存此内存,因为此行为未定义。您可能认为写掩码和采样的适当组合将强烈暗示不这样做,但这完全取决于设计驱动程序的人,并且您的结果将因硬件供应商,平台和硬件生成而变化。 / p>

这种情况是NV的纹理障碍扩展等用例,但这是特定于供应商的,但仍然没有完全解决问题。如果你想要便携式地做这件事,最好的办法是将引擎升级到GL4并使用标准化功能进行早期碎片测试,障碍等。

你的复合传递首先是否真的需要深度缓冲?听起来你想要从存储的深度缓冲区重新构建每个像素的位置。这完全可能在没有深度附件的帧缓冲中完成。

此时您的G-Buffers已经填满,之后您不再需要进行任何片段测试。通过所有先前测试的一个片段是最终写入G-Buffer的内容,并且在进行照明时没有理由对其应用任何额外的测试。