我在OpenGL程序中有一个带有多个颜色附件的帧缓冲区对象,我正在尝试将其升级为多重采样的FBO。
据我了解,多重采样FBO只能使用渲染缓冲区,特别是使用glRenderbufferStorageMultisampleEXT
创建的渲染缓冲区。如果我想要在纹理中渲染到这个FBO的东西,我需要为其附件创建第二个带有纹理的FBO,然后使用glBlitFramebufferEXT
将多重采样的FBO blit到常规FBO。
我见过的非常非常稀疏的例子假设是单色附件。当我想要多个颜色附件时,我该怎么办?
答案 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]