在目标 GL_TEXTURE_2D 的纹理上渲染相机预览
Render camera preview on a Texture with target GL_TEXTURE_2D
我正在尝试使用目标 GL_TEXTURE_2D
在 OpenGL 纹理上渲染相机预览。我非常了解 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
,当新帧出现时,您只需在 GL_TEXTURE_2D
目标上重新绘制它。
谈到 OpenGL ES 领域时,事情会变得非常复杂。让我尝试以我有限的经验向您解释这一点。下面是一些伪代码。
如果要将相机数据渲染到离屏纹理,则需要离屏帧缓冲区。您可能需要的一些功能。
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]);
编译您的 vertex
和 fragment
着色器以及 link 您的 program
.
- 准备好你的
vertex
、textureCoordinates
和 drawList
缓冲液。
将你的SurfaceTexture
从相机绑定到某个GL_TEXTURE
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, cameraSurfaceTextureHandle);
GLES20.glUseProgram(yourProgram)
, link 以上所有加在一起, GLES20.glDrawElements
我正在尝试使用目标 GL_TEXTURE_2D
在 OpenGL 纹理上渲染相机预览。我非常了解 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
,当新帧出现时,您只需在 GL_TEXTURE_2D
目标上重新绘制它。
谈到 OpenGL ES 领域时,事情会变得非常复杂。让我尝试以我有限的经验向您解释这一点。下面是一些伪代码。
如果要将相机数据渲染到离屏纹理,则需要离屏帧缓冲区。您可能需要的一些功能。
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]);
编译您的
vertex
和fragment
着色器以及 link 您的program
.- 准备好你的
vertex
、textureCoordinates
和drawList
缓冲液。 将你的
SurfaceTexture
从相机绑定到某个GL_TEXTUREGLES20.glActiveTexture(GLES20.GL_TEXTURE1); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, cameraSurfaceTextureHandle);
GLES20.glUseProgram(yourProgram)
, link 以上所有加在一起,GLES20.glDrawElements