多个EAGLViews但每个纹理只有一个副本 - 如何?

时间:2011-09-25 18:23:22

标签: ios opengl-es eaglview

我有一个在iPad上运行的应用,它使用大量纹理,渲染成一个EAGLView。现在我需要第二个EAGLView,与第一个共享纹理。

我可以通过修复Apple代码中的一些设计错误(例如,默认的ViewController需要一些调整来支持多个子EAGLView对象),使两个视图在屏幕上并行渲染得很好。但我无法分享纹理。

我无法复制纹理(这会使内存使用量增加一倍 - 我们已经使用了大部分内存)。

我找不到Apple提供的关于如何在多个EAGLView之间共享纹理的任何文档 - 有“提示”这是EAGLShareGroup的用途,允许每个GLView拥有自己的上下文,但是两个上下文共享一个ShareGroup - 但我找不到任何明确的内容。

我已尝试按照这个问题的答案:Textures not drawing if multiple EAGLViews are used

......但这不是一个真正的答案。它指出EAGLSharegroup没有实际解释如何使用它 - 它似乎没有任何区别。它还间接指向一个关于从多个线程渲染的页面 - 这是一个完全不同的问题,我没有列出任何问题(app崩溃等)。

2 个答案:

答案 0 :(得分:3)

事实证明,Apple的未记录的EAGLShareGroup(http://developer.apple.com/library/ios/#documentation/OpenGLES/Reference/EAGLSharegroup_ClassRef/Reference/EAGLSharegroup.html)...在不知道其秘密init方法的情况下无法实例化。

我不知道那是什么 - 它没有记录 - 但你可以获得一个EAGLContext来为你实例化第一个共享组,然后将其作为你的共享全局共享组。

因此,以下内容永远不会有效:

EAGLShareGroup *group = [[EAGLShareGropu alloc] init];
EAGLContext *context1 = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:group];
EAGLContext *context2 = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:group];

但是,以下工作完美无缺:

EAGLContext *context1 = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
EAGLContext *context2 = [[EAGLContext alloc] initWithAPI:[context1 API] sharegroup:context1.sharegroup];

(编辑使context2也使用context1的API - 根据Apple的ES编程指南,根据Pivot的评论)

答案 1 :(得分:3)

有两个选项,使用与第一个使用Adam的第二个代码示例相同的共享组创建第二个上下文。

或者,您可以对两个视图使用相同的上下文。为此,您可能应该拥有ViewController所拥有的上下文。然后,当您想要使用上下文渲染到特定视图时,可以在该视图的framebuffer对象上调用glBindFramebuffer(),并在视图特定的colorbuffer上调用-presentRenderbuffer。这种情况可能比使用两个共享上下文稍微有效。