android从GL_TEXTURE_EXTERNAL_OES读取像素

时间:2014-04-23 23:24:22

标签: android opengl-es

我正在尝试从与GL_TEXTURE_EXTERNAL_OES绑定的OpenGL纹理中读取像素/数据。

将纹理绑定到该目标的原因是因为为了在Android上获取实时相机源,需要从绑定到GL_TEXTURE_EXTERNAL_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_INVALID_OPERATION)。

2 个答案:

答案 0 :(得分:2)

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

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]);

...

cameraTexture是您从SurfaceTexture获得的,它是用于渲染的源。这个新纹理是你应该渲染的纹理(可以在以后的渲染管道中使用)。然后这样做:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, mTextureHandle[0], 0);

cameraTexture被绘制到帧缓冲的附加纹理,使用简单的着色器程序绘制,在着色器程序正在使用时绑定cameraTexture:

glBindTexture(GL_TEXTURE_EXTERNAL_OES, cameraTexture); 

答案 1 :(得分:0)

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

texture for YUV420 to RGB conversion in OpenGL ES