混合FBO到默认帧缓冲区上

5
为了明确,当我说“默认帧缓冲”时,指的是窗口系统提供的并最终显示在您的监视器上的帧缓冲。
为了提高CAD应用程序的渲染速度,我已经成功地将3D元素与Qt处理的2D元素分离出来,并且它们现在都可以渲染到自己的FBO中。当需要将它们展示在屏幕上时,我会将3D FBO blit到默认FB上,然后我想在其上混合我的2D FBO。
我已经成功地实现了blitting部分,但是我无法看到如何混合我的2D FBO到其中?两个FBO的大小和格式都相同,并且它们都与默认FB相同。
我确定这是一个简单的操作,但我在网上找不到任何信息-我可能错过了我尝试做什么的正确术语。虽然我正在使用Qt,但我可以毫无问题地使用本机OpenGL命令。
3个回答

7
一次 blit 操作最终是一个像素复制操作。如果你想将一张图片叠加在另一张图片上,就不能使用 blit 操作。你必须将一个全屏四边形渲染成纹理,并使用适当的混合参数进行混合操作。参考链接:proper blending parameters

这似乎非常低效,我有两个相等大小的像素值数组(缓冲区),最终我只需要对其中一个元素应用数学运算以合并到另一个对应元素。OpenGL真的只将FBO视为纹理吗? - cmannett85
@cbamber85 渲染到纹理不会那么低效。 - BЈовић
1
@cbamber85:“OpenGL真的只把FBOs当作纹理处理吗?” FBOs只是图像的容器。您将图像附加到FBOs上,但FBO本身并不拥有它们。这些图像来自其他对象:纹理和渲染缓冲区。而且,无论看起来多么“低效”,在另一张图像上渲染一张图像非常快速。没有顶点变换。除了片段着色器中的纹理采样之外,没有其他东西。此外,API不会提供其他方法来执行此操作,因此它是最有效的方法。 - Nicol Bolas
好的,如果那是正確的方法,我無法反駁。 - cmannett85
1
@cbamber85:纹理四边形比blit快得多。此外,如果使用着色器是一个选项,您可以在一次传递中完成blit和混合。这将再次更快(只需要一次传递,不需要混合,即读取-修改-写入)。 - Damon

1

你可以使用GL_EXT_framebuffer_blit将帧缓冲对象的内容blit到应用程序的帧缓冲(或任何其他帧缓冲)。尽管如规范所述,无法使用混合:

像素复制绕过了片段管线。唯一影响blit的片段操作是像素所有权测试和剪刀测试。

因此,任何混合都意味着使用片段着色器,正如建议的那样。我相信使用混合的全屏通道应该非常便宜,没有什么可担心的。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接