在OpenGL中使用多个颜色附件对多重采样的FBO进行Blitting

时间:2009-11-21 00:04:40

标签: opengl colors attachment fbo multisampling

我在OpenGL程序中有一个带有多个颜色附件的帧缓冲区对象,我正在尝试将其升级为多重采样的FBO。

据我了解,多重采样FBO只能使用渲染缓冲区,特别是使用glRenderbufferStorageMultisampleEXT创建的渲染缓冲区。如果我想要在纹理中渲染到这个FBO的东西,我需要为其附件创建第二个带有纹理的FBO,然后使用glBlitFramebufferEXT将多重采样的FBO blit到常规FBO。

我见过的非常非常稀疏的例子假设是单色附件。当我想要多个颜色附件时,我该怎么办?

2 个答案:

答案 0 :(得分:1)

来自EXT_framebuffer_blit specification

  

12)我们是否应该添加对多个ReadBuffers的支持,以便这样做   可以通过一次调用BlitFramebuffer来复制多个颜色缓冲区吗?

     

已解决:不,我们考虑过这一点,但行为很尴尬   定义和功能的用途有限。

来自arb_framebuffer_object specification(取代EXT_版本)

  

传输颜色缓冲区时,将从读取中获取值       读取帧缓冲区的缓冲区并写入每个绘制缓冲区       绘制帧缓冲区,就像使用CopyPixels一样。

所以......很明显,你只能从每个blit的单个颜色缓冲区中解析。

要做多个,你需要为每个缓冲区做一个Blit,为你想要blit的每个缓冲区改变你的READ_BUFFER,并选择draw framebuffer的相应绘制缓冲区。

答案 1 :(得分:0)

您可以创建一个新的Fbo并在插槽1中将渲染缓冲区分配给插槽0.然后绑定以进行读取并将其从blit指定到您的最终目标Fbx。

即。可以创建Fbo纯粹用于绑定由另一个Fbo写入的现有renderbuffer。 Fbo实际上并不拥有连接到它的缓冲区,因此可以将多个Fbx绑定到相同的纹理/渲染缓冲区(尽管不是同时)。

//渲染到Fbo0 Fbo0:[ColorBuffer0,ColorBuffer1,DethBuffer]

//在插槽0处使用ColorBuffer1绑定另一个fbo进行读取 Fbo1:[ColorBuffer1]

// blit Fbo0 ColorBuffer0> Fbo2 Texture0 Fbo0:[ColorBuffer0,ColorBuffer1,DethBuffer] => Fbo2:[Texture0]

// blit Fbo1 ColorBuffer1(在slot0处绑定)> Fbo3 Texture1(在slot0处绑定) Fbo1:[ColorBuffer1] => Fbo3:[Texture1]

相关问题