Intereting Posts
Ошибка андроида Ошибка вывода Dx: уже подготовлен Ошибка создания окончательного архива: найденный дубликат файла для APK: classes.dex SelectableItemBackground изменение цвета для версий до леллипопа Запуск задач в backgound в NativeScript Android получает дату до 7 дней (одна неделя) Не удается найти ProxyFrameworkImpl по имени Макет отменен? Создать папку в режиме рисования Не удается установить муравьев правильно для телефонной заставки, используя eclipse и windows 8 Отображение «справки» поверх макета Android Как я могу отправлять заголовки базовой аутентификации HTTP в Android? Тестирование Android-блока: как обмануть контекст Android Разница между прослушивателем пакетов smack и слушателем сообщений Могу ли я использовать Wi-Fi для передачи данных / сообщений между двумя телефонами Android, не подключенными к маршрутизатору? AntiVirus убивает мое приложение Скользящее меню не открывается при прокрутке

Предварительный просмотр камеры на текстуре с целью GL_TEXTURE_2D

Я пытаюсь сделать предварительный просмотр камеры в OpenGL Texture с целевой GL_TEXTURE_2D . Я очень хорошо знаю SurfaceTexture, но я не могу использовать его, потому что он работает только с GL_TEXTURE_EXTERNAL_OES . В документации SurfaceTexture написано:

  Each time the texture is bound it must be bound to the GL_TEXTURE_EXTERNAL_OES target rather than the GL_TEXTURE_2D target 

Я не могу использовать GL_TEXTURE_EXTERNAL_OES потому что мне придется внести изменения в существующий код.

Есть ли способ достичь этого, что тоже быстро?

Единственный способ, которым я могу придумать, – это прослушать SurfaceTexture и когда SurfaceTexture новый кадр, вы просто перерисуете его на цель GL_TEXTURE_2D .

Когда вы попадаете в поле OpenGL ES, все может стать очень сложным. Позвольте мне попытаться объяснить это вам моим ограниченным опытом. Ниже приведен псевдокод.

  1. Если вы хотите отобразить данные камеры на внеэкранной текстуре, вам понадобится буфер за пределами экрана. Некоторые функции, которые могут вам понадобиться.

     GLES20.glGenTextures(1, textures, 0); GLES20.glGenFramebuffers(1, frames, 0); GLES20.glGenRenderbuffers(1, frameRender, 0); GLES20.glActiveTexture(ActiveTexture); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]); GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, directIntBuffer); GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, frameRender[0]); GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, width, height); GLES20.glViewport(0, 0, width, height); GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frames[0]); GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, textures[0], 0); GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT, GLES20.GL_RENDERBUFFER, frameRender[0]); 
  2. Скомпилируйте шейдеры vertex и fragment и свяжите свою program .

  3. Подготовьте буферы vertex , textureCoordinates и drawList .
  4. Привяжите SurfaceTexture от камеры к определенной GL_TEXTURE

     GLES20.glActiveTexture(GLES20.GL_TEXTURE1); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, cameraSurfaceTextureHandle); 
  5. GLES20.glUseProgram(yourProgram) , соедините все вышеперечисленное вместе и GLES20.glDrawElements