【问题标题】:Blitting multisampled FBO with multiple color attachments in OpenGL在 OpenGL 中使用多种颜色附件对多采样 FBO 进行 Blitting
【发布时间】:2010-12-18 22:34:30
【问题描述】:
我在 OpenGL 程序中有一个带有多个颜色附件的帧缓冲区对象,我正在尝试将其升级为多重采样 FBO。
据我了解,多重采样 FBO 只能使用渲染缓冲区,特别是使用 glRenderbufferStorageMultisampleEXT 创建的渲染缓冲区。如果我想在纹理中向这个 FBO 渲染一些东西,我需要为其附件创建第二个带有纹理的 FBO,然后使用 glBlitFramebufferEXT 将多重采样的 FBO blit 到常规 FBO。
我见过的非常非常稀少的例子假设是单一颜色的附件。当我想对多个颜色的附件进行 blit 时该怎么办?
【问题讨论】:
标签:
opengl
colors
attachment
fbo
multisampling
【解决方案1】:
来自EXT_framebuffer_blitspecification
12) 我们是否应该添加对多个 ReadBuffers 的支持,这样
一次调用 BlitFramebuffer 就可以复制多个颜色缓冲区?
已解决:不,我们考虑过这一点,但行为很尴尬
定义和功能是有限的使用。
来自arb_framebuffer_objectspecification(取代EXT_版本)
当颜色缓冲区被传输时,值是从读取的
读取帧缓冲区的缓冲区并写入每个绘制缓冲区
绘制帧缓冲区,就像 CopyPixels 一样。
所以...很明显,您只能从每个 blit 的单个颜色缓冲区中解析。
要做多个,你需要为每个缓冲区做一个Blit,为你想要blit的每个缓冲区更改你的READ_BUFFER,并选择绘制帧缓冲区对应的绘制缓冲区。
【解决方案2】:
您可以创建一个新的 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]