OpenGL ES |访问mipmap数组

时间:2014-11-16 07:45:42

标签: android opengl-es-2.0 mipmaps

在我的android应用程序中,我有mipmap数组的纹理

final int[] textureHandle = new int[1]; 
GLES20.glGenTextures(1, textureHandle, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureHandle);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, filter);
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);

纹理的初始大小为1024x1024。我需要获得纹理:

  • 512x512(1级)
  • 256x256(第2级)
  • 128x128(第3级)

OpenGL任何API来访问mipmap数组中的纹理吗?

1 个答案:

答案 0 :(得分:2)

完整的OpenGL为此目的进行glGetTexImage()调用。但它在任何版本的OpenGL ES中都不可用,直到当前的ES 3.1。

如果没有此调用,您可以将纹理设置为FBO附件,然后使用glReadPixels()读取内容。阅读等级lev

int[] fboIds = new int[1];
GLES20.glGenFramebuffers(1, fboIds, 0);
int fboId = fboIds[0];
glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId);
glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
                       GLES20.GL_TEXTURE_2D, mTextureHandle, lev);
glReadPixels(...);
glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);

这种方法受到一定限制,因为它只适用于可着色的纹理格式。其他格式无效作为FBO附件。 ES 2.0中唯一可以保证颜色可渲染的格式是RGBA4444RGB5_A1RGB565。许多设备都有扩展程序,可以添加对RGB8RGBA8等格式的支持。

下一个最好的方法是使用纹理渲染四边形,然后使用glReadPixels()读取结果。但是你会对渲染目标的格式有相同的限制。例如,如果纹理为RGBA8,并且您的设备不支持渲染到RGBA8曲面,则使用此方法会丢失精度。