2012-09-30 75 views
0

在iOS中,很容易将OpenGL ES 2.0渲染设置为纹理,然后使用这些纹理进行后期处理或作为纹理进行后续渲染。这似乎是跨OpenGL实现的一种相当普遍的方法。都好。根据Apple的OpenGL ES编程指南(参见第28和29页),您还可以创建并绘制多个离屏帧缓冲区对象。他们建议你这样做是为了执行离屏图像处理。但是,我无法找到并描述在呈现给用户之后如何访问用于图像处理或任何其他用途的缓冲区。什么是iOS OpenGL ES 2.0离屏帧缓冲区对象用于?

这些离屏缓冲区可以与非OpenGL框架一起用于图像处理吗?这些缓冲区可以通过CPU读回吗?

有没有人有任何指针或例子?

回答

1

图像处理是屏幕外帧缓冲区对象(FBO)的一种可能用途,但还有其他应用程序可用于此目的。

对于图像处理,最典型的情况是渲染到由纹理支持的FBO。一旦渲染了该纹理,就可以将其拉入到图像处理管道的第二阶段,或者将其用作3D场景某些部分的纹理。作为一个例子,我的GPUImage开源框架为应用于传入图像或视频帧的每个过滤阶段使用了一个由纹理支持的离屏FBO。然后下一个阶段拉入该纹理并将过滤后的结果呈现给它自己的纹理支持的FBO。

正如我所说,可以有其他应用程序的离屏渲染。其中包括延迟照明(苹果在2011年WWDC OpenGL ES视频中有一个相当不错的例子),并计算缓存的查找值供以后参考。我使用后者作为我分子应用中的优化,以加速我原子球表面上的环境遮挡照明纹理的映射。我不是为每个原子的每个片段执行一组计算,而是为一个通用球体渲染一次,然后在原子片段着色器中查找结果。

+1

对不起,也许我不清楚,但不是因为缺乏尝试。我当然明白渲染纹理的价值,我已经将它用于各种事情,包括我在SSAO的尝试。我感到困惑的是,你可以绘制非纹理的屏幕外渲染缓冲区,我不明白你可以用这些做什么。看看苹果的iOS的OpenGL ES编程指南(第28和29页)。它们将屏幕外渲染缓冲区附加到帧缓冲区 - 不是纹理,也不是EAGL屏幕渲染缓冲区。我不知道那些离线渲染缓冲区可以用于什么。 – Chuck

+0

@Chuck我有同样的问题。这是我迄今发现的。根据这里的文档,您可以“在绘制到屏幕外渲染缓冲区之后,您可以使用'glReadPixels'函数将其内容返回到CPU以供进一步处理。”本部分结尾部分:https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html#//apple_ref/doc/uid/TP40008793-CH103-SW5 – Zhao

相关问题