2011-09-25 62 views
3

我有一个在iPad上运行的应用程序,它使用大量的纹理,渲染成一个EAGLView。现在我需要第二个EAGLView,与第一个共享纹理。多个EAGLViews,但每个纹理只有一个副本 - 如何?

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

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

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

我试着回答这个问题如下:Textures not drawing if multiple EAGLViews are used

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

回答

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

(编辑来让上下文2使用CONTEXT1的API太 - 按照苹果公司的ES编程指南按照Pivot的评论)

+2

为什么 - [EAGLSharegroup init]没有记录是因为你没有写信给它。第二种用法是[EAGLContext initWithAPI:sharegroup:]是正确的方法。 – Frogblast

+0

在此说明中,上面描述的过程在适用于iOS的OpenGL ES编程指南中有关OpenGL ES上下文的部分以及正确处理跨上下文同步的注释中进行了描述:http://developer.apple。 com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithOpenGLESContexts/WorkingwithOpenGLESContexts.html#// apple_ref/doc/uid/TP40008793-CH2-SW5 – Pivot

+0

非常好,谢谢。 “列表2-2创建具有共同共享组的两个上下文”是我无法找到的一点。虽然我注意到苹果公司的列表中包含一个不存在的“CreateBestEAGLContext()”方法是没有帮助的 - 但他们可以更好地描述我的想法。 – Adam

3

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

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

+0

在与ShareGroup一起使用之前,我尝试了这一点,但无法使其工作。这有效吗?我怀疑在做这件事之前我们可能需要修复EAGLView中的一些错误(特别是,它对[EAGLContext setCurrentContext]的很多处理是可怕的) – Adam

相关问题