Хотя это не то, что я сделал, это должно быть возможно.
Если вы посмотрите текущий шаблон 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 раз в секунду и т. Д., То, чего хотят игры.