在我的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。我需要获得纹理:
有OpenGL
任何API来访问mipmap数组中的纹理吗?
答案 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中唯一可以保证颜色可渲染的格式是RGBA4444
,RGB5_A1
和RGB565
。许多设备都有扩展程序,可以添加对RGB8
和RGBA8
等格式的支持。
下一个最好的方法是使用纹理渲染四边形,然后使用glReadPixels()
读取结果。但是你会对渲染目标的格式有相同的限制。例如,如果纹理为RGBA8
,并且您的设备不支持渲染到RGBA8
曲面,则使用此方法会丢失精度。