android从GL_纹理_外部_OES读取像素

android从GL_纹理_外部_OES读取像素,android,opengl-es,Android,Opengl Es,我正在尝试从绑定到GL_texture_EXTERNAL_OES的OpenGL纹理读取像素/数据 将纹理绑定到该目标的原因是,为了在android上获取实时摄影机提要,需要从绑定到GL_纹理_外部_OES的OpenGL纹理创建SurfaceTexture 由于android使用OpenGL ES,我无法使用glGetTexImage()读取图像数据 因此,我将目标绑定到FBO,然后使用readPixels()读取它。这是我的代码: GLuint framebuffer; glGe

我正在尝试从绑定到GL_texture_EXTERNAL_OES的OpenGL纹理读取像素/数据

将纹理绑定到该目标的原因是,为了在android上获取实时摄影机提要,需要从绑定到GL_纹理_外部_OES的OpenGL纹理创建SurfaceTexture

由于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\U无效\U操作)。

GL\U TEXTURE\U EXTERNAL\U OES纹理目标通常位于YUV颜色空间中,glReadPixels()要求目标为RGB。它可能不会自动进行颜色空间转换。但是,您可以在自己的片段着色器中进行转换,该着色器将RGB渲染为另一个纹理,然后使用glReadPixels()读取该纹理


我认为这可能是问题所在:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_EXTERNAL_OES, cameraTexture, 0);
不应将cameraTexture附加到帧缓冲区,而应以GL_texture_2D格式生成新纹理

glGenTextures(1, mTextureHandle, 0);

glBindTexture(GL_TEXTURE_2D, mTextureHandle[0]);

...
CamerateTexture是从SurfaceTexture获得的,它是用于渲染的源。此新纹理是您应该渲染到的纹理(稍后可在渲染管道中使用)。然后这样做:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, mTextureHandle[0], 0);
cameraTexture绘制到帧缓冲区的附加纹理,使用简单的着色器程序绘制,并在使用着色器程序时绑定cameraTexture:

glBindTexture(GL_TEXTURE_EXTERNAL_OES, cameraTexture); 

这个答案带来了什么解决方案?我认为正确的解决方案需要将这两个答案结合在一起,首先创建一个新的帧缓冲区和一个新的纹理和glFramebufferTexture2D,然后可以使用着色器将YUV数据绘制到帧缓冲区,然后可以通过glReadPixels读取。有点复杂!这是不准确的。在Android上,YUV->RGB转换在后台自动进行。看见