OpenG GL ES рисует вне экрана, чтобы предоставить содержимое для CALayer - PullRequest
0 голосов
/ 06 июня 2011

Можно ли использовать Open GL ES для рисования за пределами экрана, чтобы создать CGImageRef для использования в качестве контента для CALayer.

Я намерен изменить изображение только один раз.Подробно я ищу эффективный способ изменения только оттенка изображения без изменения яркости.Другим решением может быть создание пиксельного буфера и непосредственное изменение данных, но это кажется вычислительно дорогим.

1 Ответ

0 голосов
/ 06 июня 2011

Хотя это не то, что я сделал, это должно быть возможно.

Если вы посмотрите текущий шаблон OpenGL ES в Xcode, особенно EAGLView.m, вы увидите, что части, которые связываютК контексту OpenGL на экране относятся:

  • строка 77, [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];, которая говорит CAEAGLLayer предоставить достаточную информацию о создаваемом там объекте кадрового буфера, чтобы его можно было отобразить на экране.
  • строка 128, success = [context presentRenderbuffer:GL_RENDERBUFFER];, что дает CAEAGLLayer указание на то, что вы нарисовали целый новый фрейм, и должно по возможности показывать это.

Что вы должны иметь возможностьdo - полностью сбросить соединение CAEAGLLayer (и, следовательно, вам не нужно создавать подкласс UIView), используйте glRenderbufferStorage или glRenderbufferStorageMultisampleAPPLE, чтобы вместо этого выделить буфер цвета для вашего кадрового буфера (так, чтобы у него было хранилище, но везде, гдеOpenGL чувствует, как будто это написано), сделайте весь свой рисунок, затем используйте glReadPixels, чтобы вернуть содержимое пикселя.

Оттуда вы можете использовать CGDataProviderCreateWithData и CGImageCreate для преобразованияНеобработанные данные пикселей в подходящий CGImageRef.

Работа с графическим процессором должна быть намного быстрее, чем вы обычно можете управлять центральным процессором, но вашими основными затратами, вероятно, будут загрузка и загрузка.Если вам на самом деле он не нужен как CGImageRef, кроме как для его отображения на экране, вам лучше всего использовать CAEAGLLayer с подклассом UIView.Они действуют точно так же, как и любое другое представление - обновление, если и когда вы отправляете новые данные, компоновка точно таким же образом, так что нет никакой дополнительной сложности.Единственный недостаток, если вы новичок, заключается в том, что большинство учебных пособий и примеров кода в OpenGL, как правило, фокусируются на настройке полноэкранного режима, обновлении 60 раз в секунду и т. Д., То, чего хотят игры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...