我在Android上使用NDK和OpenGL ES2 .

  • 我使用分辨率为1024x576的eglCreatePbufferSurface创建PBuffer曲面 . 我使用GL_RGBA格式 . 每个颜色分量8位 .

  • 从位图加载纹理并将其blit到表面上 . 调用glFlush() .

  • 比我创建另一个纹理并使用glCopyTexImage2D将帧缓冲区读入此纹理 . 纹理内部格式为GL_RGBA .

  • 我再次将新纹理blit到同一帧缓冲区 . 调用glFlush() .

  • 最后调用glReadPixels读取帧缓冲区并将其保存为Bitmap .

结果是像素化的:

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 .

Update: 我的代码似乎在模拟器上工作正常,但在Nexus 7设备上却没有 .

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