我在带有 OpenGL ES2 的 Android 上使用 NDK。
- 我使用 eglCreatePbufferSurface 创建 PBuffer 表面,分辨率为 1024x576。我使用 GL_RGBA 格式。每个颜色分量 8 位。
- 从位图中加载纹理并将其粘贴到表面上。调用 glFlush()。
- 比我创建另一个纹理并使用 glCopyTexImage2D 将帧缓冲区读入这个纹理。纹理内部格式为 GL_RGBA。
- 我再次将新纹理粘贴到同一个帧缓冲区上。调用 glFlush()。
- 最后调用 glReadPixels 读取帧缓冲区并将其保存为 Bitmap。
结果是像素化的:
我所有的纹理都有这些参数:
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 时它会像素化呢?