Я пытаюсь понять, как использовать CVOpenGLESTextureRef
и CVOpenGLESTextureCacheRef
для замены, используя glReadPixels
.
Я понимаю, как использовать их для создания текстуры из входящих изображений с камеры, как показано в демонстрациях RosyWriter и CameraRipple. Но я не могу понять, как использовать их, чтобы пойти другим путем.
Комментарии в заголовочном файле для функции CVOpenGLESTextureCacheCreateTextureFromImage
дают следующий пример:
CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache,
pixelBuffer, NULL, GL_RENDERBUFFER, GL_RGBA8_OES, width, height,
GL_RGBA, GL_UNSIGNED_BYTE, 0, &outTexture);
и это вся информация, которую я могу найти. Как вы используете это?
В настоящее время я делаю следующее, чтобы создать закадровый объект Frame Buffer в начале приложения.
glGenFramebuffersOES(1, &frameBufferHandle);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, frameBufferHandle);
glGenRenderbuffersOES(1, &colorBufferHandle);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorBufferHandle);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGBA8_OES, width, height);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES,
GL_COLOR_ATTACHMENT0_OES,GL_RENDERBUFFER_OES, colorBufferHandle);
Затем, когда мне нужно записать его на диск, я связываю его и вызываю glReadPixels
.
- Как бы я использовал
CVOpenGLESTextureRef
и CVOpenGLESTextureCacheRef
вместо вышеуказанного?
- Как бы я использовал его в основном буфере рендеринга, а не на внеэкранном FBO?
Другая информация, которая может иметь отношение к делу:
- Я использую OpenGL ES 1.1 на устройствах с поддержкой 2.0 (переход на 2.0 невозможен).
- Я уже использую
CVOpenGLESTextureRef
и CVOpenGLESTextureCacheRef
для отображения видеоизображения с камеры на экране.
- Я записываю видео в формате
CVPixelBufferRefs
и BRGA.
- Если я использую основной буфер рендеринга, я могу позвонить
glReadPixels
с GL_BGRA_EXT
.
- Если я использую FBO вне экрана (для меньшего размера видео), я должен использовать формат RGBA и делать немного прыщ.