2011-09-17 2 views
0

В Android рендеринг получает объект GL10 в onSurfaceCreated, onSurfaceChanged и onDraw. Действительно ли этот фактический экземпляр GL10 имеет какое-то особое значение, или вы можете создать экземпляр любого экземпляра GL10, который вы хотите?Являются ли контексты GL «значительными»?

Я спрашиваю, что у меня есть два, казалось бы, противоречивых частей информации, которую я почерпнутые из различных источников:

  1. Я искал через исходный код для gl2-андроида, который представляет собой набор ES 2.0. В этом примере GL2Test.java, пройденные экземпляры GL10 полностью игнорируются. Средство визуализации просто создает экземпляр AndroidGL20 и использует это вместо этого.

  2. Я работал с кодом Роберта Грина для живых обоев OpenGL. В многочисленных комментариях, перечисленных в его вводном сообщении в блоге, некоторые люди указали, что иногда контекст GL10, который передается в onSurfaceCreated, изменяется на другой экземпляр. Если это произойдет, рисование завершится неудачно, если вы не перезагрузите свои текстуры с помощью нового экземпляра. Таким образом, исправление заключается в том, чтобы протестировать в начале onSurfaceCreated, чтобы убедиться, что это тот же самый экземпляр GL10 и решает оттуда перезагрузить. (Вы не хотите, чтобы перезагрузить каждый раз, потому что onSurfaceCreated вызывается с каждым поворотом экрана, который должен поддерживаться живыми обоями.)

То, что я пытаюсь сделать, это создать gl2-андроид для используйте живые обои. Но я хочу быть уверенным, что могу использовать его таким образом, чтобы это было безопасно от проблемы, описанной выше в номере 2.

ответ

1

GL Контексты - это объекты, которые содержат всю информацию текущего экземпляра OpenGL. Всякий раз, когда вы создаете текстуру, буфер вершин, поверхность, шейдер или изменяете состояние (режим смешивания, альфа и т. Д.), Все они сохраняются в контексте . Уничтожение контекста в конечном итоге уничтожит объекты, созданные в этом контексте, и сбросит состояние OpenGL, в этом смысле они очень «значительны»!

Метод OnSurfaceCreated вызывается всякий раз, когда новый контекст был создан в первый раз или после уничтожения предыдущего (из-за возврата на главный экран, отключения дисплея или изменения ориентации). Вот почему вы после этого вам нужно будет повторно создать/загрузить все ваши ресурсы, поскольку предыдущий был уничтожен всеми связанными с ним ресурсами.

+0

Спасибо за ваш ответ - это полезно. Я просто хочу добавить эту информацию, которую я получил от автора «Начало игр для Android», что более конкретно для информации, которую я искал. Это хорошо сработало для меня: – Tenfour04

+1

Фактический экземпляр GL10, который передается в onSurfaceCreated() и onDrawFrame(), не содержит никакой информации, специфичной для контекста GL, которая назначается при вызове функции onSurfaceCreated(). Вы можете использовать любой экземпляр GL10, который вам нравится делать в любом потоке рендеринга. Просто используйте onSurfaceCreated() в качестве сигнала, что вам нужно перезагрузить шейдеры и текстуры и т. Д. – Tenfour04

Смежные вопросы