使用目标GL_TEXTURE_2D在纹理上渲染相机预览

ome*_*erk 4 shader android opengl-es render-to-texture android-camera

我正在尝试使用目标在OpenGL纹理上渲染相机预览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
Run Code Online (Sandbox Code Playgroud)

我无法使用,GL_TEXTURE_EXTERNAL_OES因为我必须在现有代码中进行大量更改.

有没有办法实现这一目标也很快?

son*_*wen 6

我能想到的唯一方法就是收听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]);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编译vertexfragment着色器和链接你的program.

  3. 准备好你的vertex,textureCoordinatesdrawList缓冲区.
  4. 将您SurfaceTexture的相机绑定到某个GL_TEXTURE

    GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, cameraSurfaceTextureHandle);
    
    Run Code Online (Sandbox Code Playgroud)
  5. GLES20.glUseProgram(yourProgram),将以上所有内容联系起来,并且 GLES20.glDrawElements