【问题标题】:android read pixels from GL_TEXTURE_EXTERNAL_OESandroid 从 GL_TEXTURE_EXTERNAL_OES 读取像素
【发布时间】:2014-04-23 23:24:21
【问题描述】:

我正在尝试从绑定到 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)。

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

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

    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绘制到framebuffer的附加纹理,使用简单的shader程序进行绘制,在shader程序使用时绑定cameraTexture:

    glBindTexture(GL_TEXTURE_EXTERNAL_OES, cameraTexture); 
    

    【讨论】:

    • 这个答案带来了什么解决方案?
    • 我认为正确的解决方案需要将2个答案结合在一起,首先创建一个新的帧缓冲区和一个新的纹理和glFramebufferTexture2D,然后您可以使用shader将YUV数据绘制到帧缓冲区然后它可以通过 glReadPixels 读取。有点复杂!
    【解决方案2】:

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

    texture for YUV420 to RGB conversion in OpenGL ES

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多