Несколько EAGLViews, но только одна копия каждой текстуры - как? - PullRequest
3 голосов
/ 25 сентября 2011

У меня есть приложение, работающее на iPad, которое использует множество текстур, рендеринг в один EAGLView. Теперь мне нужен второй EAGLView, разделяющий текстуры с первым.

Я могу добиться того, чтобы оба представления хорошо отображались параллельно на экране, исправляя некоторые ошибки проектирования в коде Apple (например, для ViewController по умолчанию требуются некоторые настройки для поддержки нескольких дочерних объектов EAGLView). Но я не могу получить доступ к текстурам.

Я не могу дублировать текстуры (это удвоило бы использование памяти - и мы уже используем большую часть памяти).

Я не могу найти никакой документации от Apple о том, как обмениваться текстурами между несколькими EAGLView - есть «намеки» на то, для чего предназначен EAGLShareGroup, позволяющий каждому GLView иметь свой собственный контекст, но два контекста для совместного использования ShareGroup - но ничего явного, что я смог найти.

Я пытался найти ответ на этот вопрос: Текстуры не рисуются, если используется несколько EAGLViews

... но это не был действительно ответ. Он указал на EAGLSharegroup, фактически не объясняя, как его использовать - кажется, что нет никакой разницы. Он также косвенно указывал на страницу о рендеринге из нескольких потоков - это совершенно другая проблема, и у меня нет никаких проблем, перечисленных там (сбой приложения и т. Д.).

Ответы [ 2 ]

3 голосов
/ 25 сентября 2011

Есть два варианта: создать второй контекст, используя ту же группу, что и первый. Для этого используйте второй пример кода Адама.

Кроме того, вы можете использовать один и тот же контекст для обоих представлений. Для этого вы, вероятно, должны иметь контекст, принадлежащий ViewController. Затем, когда вы хотите использовать контекст для рендеринга в конкретное представление, вы вызываете glBindFramebuffer () для объекта framebuffer этого представления и вызываете -presentRenderbuffer для цветового буфера, зависящего от представления. Этот случай, вероятно, несколько более эффективен, чем использование двух общих контекстов.

3 голосов
/ 25 сентября 2011

Оказывается, что недокументированная группа Apple EAGLShareGroup (http://developer.apple.com/library/ios/#documentation/OpenGLES/Reference/EAGLSharegroup_ClassRef/Reference/EAGLSharegroup.html) ... не может быть создана без знания секретного метода инициализации.

Я понятия не имею, что это такое - это недокументировано - но вы можете получить 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 использовал API context1 тоже - согласно руководству по программированию ES от Apple, согласно комментарию Pivot)

...