Предварительный просмотр камеры на текстуре с целью 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

Intereting Posts