2012-01-23 36 views
5

为了澄清,当我说'默认帧缓冲区'时,我的意思是由窗口系统提供的那个,以及在监视器上的结果。将FBO混合到默认帧缓冲区

为了提高我的CAD应用程序的渲染速度,我设法从Qt处理的2D元素中分离出3D元素,并且他们现在分别渲染成它们自己的FBO。当把它们放到屏幕上时,我将3D FBO闪光到默认的FB上,然后我想在它上面混合我的2D FBO。

我已经到了blitting的部分,但我看不到如何将我的2D FBO融合到它上面?两个FBO在大小和格式上都是相同的,它们都与默认的FB相同。

我相信这是一个简单的操作,但我无法在网上找到任何东西 - 大概我错过了正在尝试做的事。虽然我使用Qt,但我可以使用本机OpenGL命令而不会出现问题。

回答

7

blit操作最终是像素复制操作。如果您想将一个图像叠加到另一个图像上,则无法将其粘贴。您必须将全屏四边形渲染为纹理,并使用proper blending parameters进行混合操作。

+0

这完全是可怕的效率低下,虽然,我有相同大小的像素值(缓冲区)的两个数组,最终所有我需要做的是应用数学运算其中之一的元素合并另一个的相应元素。 OpenGL真的只把FBO当作纹理吗? – cmannett85

+0

@ cbamber85渲染纹理不会那么低效 –

+1

@ cbamber85:“OpenGL是否真的只将FBO作为纹理处理?” FBO只是图像的容器。您将图像附加到FBO,但FBO本身不拥有它们。图像来自其他对象:纹理和渲染缓冲区。然而,无论看起来“效率低下”,渲染一幅图像都非常快。没有顶点变换。无非是片段着色器中的纹理采样。此外,API不会为您提供另一种方式来执行此操作,因此它的效率与其获得的效率相同。 –

1

您可以使用GL_EXT_framebuffer_blitblit帧缓冲区对象的内容到应用程序帧缓冲区(或任何其他)。尽管如规格所述,不可能使用混合:

像素副本绕过片段管道。影响blit的唯一片段 是像素所有权测试和 剪式测试。

因此,任何混合手段使用片段着色器建议。一个全屏通过混合应该是相当便宜的,我相信没有什么可担心的。

相关问题