Android читает пиксели от GL_TEXTURE_EXTERNAL_OES

Я пытаюсь читать пиксели / данные из текстуры OpenGL, которая привязана к GL_TEXTURE_EXTERNAL_OES.

Причиной привязки текстуры к этой цели является то, что для того, чтобы получить прямую трансляцию камеры на Android, SurfaceTexture необходимо создать из текстуры OpenGL, которая привязана к GL_TEXTURE_EXTERNAL_OES.

Поскольку Android использует OpenGL ES, я не могу использовать glGetTexImage () для чтения данных изображения.

Поэтому я привязываю цель к FBO, а затем читаю ее с помощью readPixels (). Это мой код:

GLuint framebuffer; glGenFramebuffers(1, &framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); //Attach 2D texture to this FBO glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, cameraTexture, 0); status("glFramebufferTexture2D() returned error %d", glGetError()); 

Однако по какой-то причине я получаю ошибку 1282 (GL_INVALID_OPERATION).

Объект текстуры GL_TEXTURE_EXTERNAL_OES обычно находится в цветовом пространстве YUV, а glReadPixels () требует, чтобы цель была RGB. Вероятно, это не делает автоматическое преобразование цветового пространства. Тем не менее, вы можете сделать преобразование в свой собственный шейдер фрагмента, который отображает RGB в другую текстуру, а затем используйте glReadPixels (), чтобы прочитать это.

Текстуры для преобразования YUV420 в RGB в OpenGL ES

Я думаю, это может быть проблемой:

 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, cameraTexture, 0); 

Вы не должны прикреплять камеру к текстуре фреймбуфера, вместо этого вы должны создать новую текстуру в формате GL_TEXTURE_2D

 glGenTextures(1, mTextureHandle, 0); glBindTexture(GL_TEXTURE_2D, mTextureHandle[0]); ... 

CameraTexture – это тот, который вы получаете из SurfaceTexture, и это источник, используемый для рендеринга. Эта новая текстура – та, которую вы должны отобразить (которая может быть использована позже в конвейере рендеринга). Затем сделайте следующее:

 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextureHandle[0], 0); 

CameraTexture обращается к прикрепленной текстуре фреймбуфера, используя простую программу шейдера для рисования, привязывает CameraTexture, когда используется программа шейдера:

 glBindTexture(GL_TEXTURE_EXTERNAL_OES, cameraTexture); 
Intereting Posts
Как установить клиент webview? Ориентировочная точка установки Android для анимации масштаба Сделать обычную тему использовать нулевой фон (предложение Android lint) Как создать эффект пульсации для предварительного леденца Как я могу сделать SQLite Database Context null в OnDestroy () в Android? Как отправить файл с помощью bluetooth на андроид программно? Как отменить существующее расписание таймера Отключить один ключ на пользовательской клавиатуре на Android Как импортировать com.google.maps.android.SphericalUtil в Android Studio? Как выбрать уникальные контакты из Android Honeycomb SDK нарушает обратную совместимость GridView? Публикация мобильного сайта в App Store и Google Play Потребитель закрыл входной канал или возникла ошибка App объявляет зависимость от конфигурации 'compile' к конфигурации 'default', которая не объявлена ​​в дескрипторе для проекта Как получить журнал во время выполнения, когда сила закрытия приложения Android