【发布时间】:2015-07-23 00:12:12
【问题描述】:
我正在使用使用 OpenGL 3.3 的延迟渲染引擎。我有一个 FBO 设置为我的 G 缓冲区,并附有一个纹理作为深度组件。
在我的光照通道中,我需要进行深度测试(禁用写入)以剔除不必要的像素。但是,我目前正在编写重建世界位置坐标的代码,这也需要访问深度缓冲区。
在 Opengl 3.3 中将深度附件绑定到纹理单元并对其进行采样,同时在同一通道中使用它进行深度测试是否合法?
我在文档中找不到任何关于它的具体内容,但我的直觉告诉我,将相同的缓冲区/纹理用于两种不同的目的会产生未定义的行为。有人确定吗?我有一组有限的硬件可供测试,并且不想对有效的硬件做出错误的假设。
【问题讨论】:
-
this thread 中的评论表明这是未定义的行为。因为我找不到任何确定的东西,所以让问题悬而未决。
-
Fibbles 是对的。据我所知,您无法在同一通道中读写 FBO。而且由于采样正在读取 FBO 并渲染到深度缓冲区正在写入,这可能不起作用。
-
检查规范后,我同意您链接的线程中的 Alfonse Reinheart。常识表明,如果您禁用深度写入,这可能没问题。但是我在规范中找不到任何特别允许这样做的东西。按照我的阅读方式,这仍然符合渲染反馈循环的条件,即使禁用了深度写入,因此行为是未定义的。
-
我最终在各种硬件/驱动程序上进行了测试,结果肯定是不确定的。我最终不得不使用深度附件和 GL_R32F 颜色附件来实现 G-Buffer,其中还包含深度信息,以便稍后在照明通道中读取它。乍一看似乎很浪费,但它仍然比我之前使用的深度附件加上 GL_RGB32F 颜色附件(用于世界坐标)更有效。
标签: opengl opengl-3 fbo depth-buffer