是否可以使用OpenGL和GLSL在MRT上下文中填充深度缓冲区和颜色缓冲区?

时间:2015-07-30 17:55:19

标签: opengl glsl shader

这是我的情况:

我使用MRT(多重渲染目标)编写了一个小型延迟3D引擎来填充我的G-Buffer(我的所有位置,法线,颜色和镜面纹理同时被填充)。

此外,我已经将我的G-Buffer FBO附加了一个初始化为GL_DEPTH_STENCIL_ATTACHMENT(GL_DEPTH24_STENCIL8)的渲染缓冲区对象(RBO)。因此,在G-Buffer执行期间,我的4个纹理被同时填充,渲染缓冲区同时填充模板和深度缓冲区。

我有两个问题:

  • 是否可以出于任何原因使用此深度缓冲区作为片段着色器中的sampler2D均匀变量,例如我可以用来计算光照过程中的某些东西(例如,从深度恢复视图空间中的顶点位置)?直接使用这个深度缓冲区会增加时间!

如果不可能:

  • 是否可以在MRT中填充深度纹理(GL_DEPTH_COMPONENT格式)?例如,是否可以使用MRT渲染技术填充深度纹理和颜色纹理? (我尝试没有任何成功,但也许我被抓得很厉害)。我是否需要使用MRT和深度缓冲区分别填充我的颜色缓冲区(此处需要两个渲染过程而不是一个)?

如果再也不可能,你有什么建议吗?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

  

是否可以出于任何原因使用此深度缓冲区作为sampler2D   片段着色器中的统一变量,例如我可以使用   在灯光通过期间计算某些东西(例如,恢复   视图空间中的顶点位置从深度开始)?这将是一个时间的收获   直接使用这个深度缓冲区!

是的,深度缓冲区可以是片段着色器中的采样器,可以使用典型的texture(depthTexture,...)命令进行访问。

在典型的延迟渲染路径中,首先编写gBuffer(深度缓冲区是gBuffer的一部分)然后将所有gBuffer纹理绑定到采样器并在照明计算时使用它们。

如果你的意思是'这个'要对当前使用的深度缓冲区进行采样的深度缓冲区,然后这是不可能的。纹理不能同时写入和读取(OpenGL ES可能是一个例外)。

  

是否可以填充深度纹理(GL_DEPTH_COMPONENT格式)   在捷运?例如,是否可以填充深度纹理和   使用MRT渲染技术的颜色纹理? (我试过没有   成功,但也许我被抓得很厉害)。我需要填充我的颜色吗?   缓冲区使用MRT和深度缓冲区分开(两个渲染过程   这里需要而不是一个)?

是的,正如我上面所说,这是典型的方式。只需将深度纹理附加到帧缓冲区的深度部分(或者如果深度+模板纹理将其附加到帧缓冲区的深度+模板部分)。见https://www.opengl.org/sdk/docs/man4/docbook4/xhtml/glFramebufferTexture.xml

<强>更新

对不起,我在某种程度上没有读过,你在谈论RBO。

不,RBO的深度缓冲区可以绑定到纹理采样器(因为它不是纹理)。有两种方法可以解决这个问题:

  • 使用FBO代替附加了深度纹理的RBO。 (推荐)
  • 将RBO的数据复制到深度纹理。如果你真的想这样做,还有两种可能的方法:

    • 创建一个仅附加了深度纹理的FBO,并使用glBlitFramebuffers将RBO复制到该纹理,请参阅:https://www.opengl.org/sdk/docs/man3/xhtml/glBlitFramebuffer.xml
    • 使用glReadPixel将深度缓冲区复制到CPU,然后将其复制回深度纹理。 (当然建议使用FBO方法,因为它将是GPU-> GPU转移。)