1

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

据我了解,多重采样 FBO 只能使用渲染缓冲区,特别是使用glRenderbufferStorageMultisampleEXT. 如果我想要在纹理中渲染到这个 FBO,我需要创建第二个带有纹理的 FBO,然后使用glBlitFramebufferEXT.

我见过的非常非常稀少的例子假设一个单一的颜色附件。当我想对多个颜色附件进行 blit 时该怎么办?

4

2 回答 2

2

EXT_framebuffer_blit 规范

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

已解决:不,我们考虑过这一点,但这种行为难以定义,并且功能用途有限。

来自arb_framebuffer_object 规范(取代 EXT_ 版本)

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

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

要执行多个,您需要为每个缓冲区执行一次 Blit,更改您READ_BUFFER想要 blit 的每个缓冲区,然后选择绘制帧缓冲区的相应绘制缓冲区。

于 2009-11-24T21:40:46.050 回答
0

您可以创建一个新的 Fbo 并将插槽 1 中的渲染缓冲区分配给它的插槽 0。然后绑定以读取并从该位置传输到最终目标 Fbx。

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

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

// 在 slot 0 处使用 ColorBuffer1 绑定另一个 fbo 以读取 Fbo1 : [ColorBuffer1]

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

//blit Fbo1 ColorBuffer1 (bound at slot0) > Fbo3 Texture1 (bound at slot0) Fbo1 : [ColorBuffer1] => Fbo3 : [Texture1]

于 2017-11-14T21:24:27.717 回答