这是我的情况:
我使用MRT(多重渲染目标)编写了一个小型延迟3D引擎来填充我的G-Buffer(我的所有位置,法线,颜色和镜面纹理同时被填充)。
此外,我已经将我的G-Buffer FBO附加了一个初始化为GL_DEPTH_STENCIL_ATTACHMENT(GL_DEPTH24_STENCIL8)的渲染缓冲区对象(RBO)。因此,在G-Buffer执行期间,我的4个纹理被同时填充,渲染缓冲区同时填充模板和深度缓冲区。
我有两个问题:
如果不可能:
如果再也不可能,你有什么建议吗?
非常感谢您的帮助!
答案 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的深度缓冲区可以不绑定到纹理采样器(因为它不是纹理)。有两种方法可以解决这个问题:
将RBO的数据复制到深度纹理。如果你真的想这样做,还有两种可能的方法:
glBlitFramebuffers
将RBO复制到该纹理,请参阅:https://www.opengl.org/sdk/docs/man3/xhtml/glBlitFramebuffer.xml glReadPixel
将深度缓冲区复制到CPU,然后将其复制回深度纹理。 (当然建议使用FBO方法,因为它将是GPU-> GPU转移。)