如何合并两个FBO?

3

好的,我有4个缓冲区、3个FBO和一个渲染缓冲区。让我解释一下。

我有一个视图FBO,它将在我将场景渲染到渲染缓冲区之前存储该场景。

我有一个背景缓冲区,其中包含场景的背景。

我有一个用户缓冲区,用户可以操作它。

当用户执行某些操作时,我使用一些混合来绘制到用户缓冲区。

然后重新绘制整个场景,我想要做的是清除视图缓冲区,将背景缓冲区绘制到视图缓冲区,更改混合,然后将用户缓冲区绘制到视图缓冲区。最后将视图缓冲区渲染到渲染缓冲区。

然而,我无法弄清楚如何将一个FBO绘制到另一个FBO上。我想要做的实质上是合并和混合两个FBO,但我不知道如何做!我对OpenGL ES非常陌生,感谢所有的帮助。

1个回答

2
设置你的屏幕外帧缓冲区直接渲染到纹理。这个链接会告诉你如何做:

http://developer.apple.com/iphone/library/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html#//apple_ref/doc/uid/TP40008793-CH103-SW7

让我花一点时间来描述帧缓冲和渲染缓冲,为了我的利益和你的利益。帧缓冲就像一个端口,接受OpenGL渲染命令。在您可以看到或使用渲染输出之前,它必须附加到纹理或渲染缓冲区。您可以选择使用glFramebufferTexture2DOES附加纹理或使用glFramebufferRenderbufferOES附加渲染缓冲区。渲染缓冲区就像一个光栅图像,保存渲染结果。光栅图像的存储由OpenGL管理。如果您希望将图像显示在屏幕上而不是离屏缓冲区中,您可以使用-[EAGLContext renderBufferStorage:fromDrawable:]使用EAGLContext的存储与渲染缓冲区。这段代码在OpenGL ES项目模板中。您可能不需要视图帧缓冲区,因为在将场景背景和用户层渲染到纹理后,您可以将这些纹理绘制到渲染缓冲区中(即与屏幕渲染缓冲区相关联的帧缓冲区)。

在看了很久之后,感谢我终于找到了这个答案。不知何故,我一直认为那会非常慢。 - DevDevDev
我发现非常缓慢的是全屏透明混合。将4个图层混合在一起,我的帧速率降到了15 FPS。我不需要时必须小心地关闭混合。 - codewarrior
谢谢你的提示。在帧之间只有一小部分会改变,有没有一种简单的方法来清除和重绘帧的某些部分呢?例如,假设您有一个矩形绘图程序。在用户输入(touchesEnded)时,您计算用户进行更改的矩形区域,在那里清除像素,重新绘制该矩形中的背景,然后绘制用户操作?我的意思是我可以手动做一些事情,但我希望OpenGL有这个功能。 另外,是否可能将两个渲染缓冲区合并在一起?对不起问了这么多问题,但大多数教程写得都很差... - DevDevDev
该算法有时被称为“dirty rects”。它超出了像OpenGL这样的图形库的范围,通常在布局或视图管理中实现。您将需要根据应用程序状态的变化计算哪些矩形需要重新绘制。一旦计算出脏矩形,您就可以使用glScissor限制绘图区域并节省GPU时间。 - codewarrior

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