3

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

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

我无法复制纹理(这会使内存使用量翻倍——而且我们已经使用了大部分内存)。

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

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

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

4

2 回答 2

3

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

我不知道那是什么——它没有记录——但你可以得到一个 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 的评论)

于 2011-09-25T18:36:28.130 回答
3

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

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

于 2011-09-25T19:31:20.950 回答