android 从 GL_TEXTURE_EXTERNAL_OES 读取像素

标签 android opengl-es

我正在尝试从绑定(bind)到 GL_TEXTURE_EXTERNAL_OES 的 OpenGL 纹理读取像素/数据。

将纹理绑定(bind)到该目标的原因是因为为了在 android 上获得实时摄像头反馈,需要从绑定(bind)到 GL_TEXTURE_EXTERNAL_OES 的 OpenGL 纹理创建 SurfaceTexture。

由于 android 使用 OpenGL ES 我不能使用 glGetTexImage() 来读取图像数据。

因此我将目标绑定(bind)到 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)。

最佳答案

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

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的attached texture上,使用一个简单的shader程序绘制,使用shader程序时绑定(bind)cameraTexture:

glBindTexture(GL_TEXTURE_EXTERNAL_OES, cameraTexture); 

关于android 从 GL_TEXTURE_EXTERNAL_OES 读取像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23256991/

相关文章:

java - JNI 方法 : formal argument lists differ in length

android - 从适配器中的字符串获取 Android 资源 ID

android - 错误 : The method getFilter() is undefined for the type FriendsActivity. ListAdapter

java - 在 Android 上使用 OpenGL ES 使对象/形状原地旋转

java - Android:OpenGL ES:无法处理太宽的纹理?

java - 托管 Web 服务(Netbeans)

java - getStringExtra() 总是抛出 NullPointerException

java - Android - 带有 OPENGL + 纹理的 3D 立方体

iOS 在 UIView 中绘制像素

ios - opengl es2 预乘与直接 alpha + 混合