从PBuffer读取时,glCopyTexImage2D不适用于GL_RGBA

时间:2013-07-17 05:09:47

标签: android opengl-es android-ndk opengl-es-2.0 glreadpixels

我在Android上使用NDK与OpenGL ES2。

  1. 我使用分辨率为1024x576的eglCreatePbufferSurface创建PBuffer表面。我使用GL_RGBA格式。每个颜色分量8位。
  2. 从位图加载纹理并将其blit到表面上。调用glFlush()。
  3. 我创建另一个纹理并使用glCopyTexImage2D将帧缓冲区读入此纹理。纹理内部格式为GL_RGBA。
  4. 我再次将新纹理blit到同一帧缓冲区。调用glFlush()。
  5. 最后调用glReadPixels读取帧缓冲区并将其保存为Bitmap。
  6. 结果是像素化的:
    sample image

    我的所有纹理都有这些参数:

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    

    此外,如果我使用窗口表面而不是PBuffer并在屏幕上绘制结果,它是正确的而不是像素化的。
    我尝试的另一件事是将原始纹理渲染到PBuffer并立即从缓冲区读取像素。没有使用glCopyTexImage2D的额外传递。结果也是正确的。

    如果我将glCopyTexImage2D内部格式从GL_RGBA更改为GL_RGB,一切正常。我的PBuffer颜色空间格式是RGBA。

    更新:我的代码似乎在模拟器上运行良好,但在Nexus 7设备上运行不正常。

    那么为什么当我使用GL_RGBA格式的glCopyTexImage2D时它会像素化?

0 个答案:

没有答案