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

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

我可以在屏幕上通过修复苹果代码中的一些devise错误(例如,默认的ViewController需要一些调整来支持多个子EAGLView对象)来同时呈现两个视图。 但是我无法获得共享的纹理。

我不能复制纹理(这会增加内存使用量,而且我们已经使用了大部分内存)。

我找不到任何有关如何在多个EAGLView之间共享纹理的文档 – 有一些“提示”,这就是EAGLShareGroup的作用,允许每个GLView有自己的上下文,但是共享一个ShareGroup的两个上下文没有明确的我可以find。

我试着按照这个问题的答案: 如果使用多个EAGLViews,则不绘制纹理

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

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

或者,您可以对两个视图使用相同的上下文。 要做到这一点,你应该可以拥有ViewController的上下文。 然后,当你想使用上下文来渲染一个特定的视图时,你可以在该视图的framebuffer对象上调用glBindFramebuffer(),并在特定于视图的颜色缓冲区上调用-presentRenderbuffer。 这种情况可能比使用两个共享上下文更有效率。

事实certificate,苹果的无证EAGLShareGroup( http://developer.apple.com/library/ios/#documentation/OpenGLES/Reference/EAGLSharegroup_ClassRef/Reference/EAGLSharegroup.html )…不能被实例化,不知道它的秘密初始化方法( S)。

我不知道这是什么 – 它没有logging – 但是你可以得到一个EAGLContext为你实例化第一个共享组,然后创build你共享的全局共享组。

所以,以下将永远不会工作:

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]; 

(根据苹果的ES编程指南编辑context2使用context1的API,按照Pivot的评论)