2014-11-16 80 views
0

在我的Android应用程序,我有质感的纹理贴图阵列OpenGL ES |访问纹理贴图阵列

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); 

质感的初始大小为1024×1024。我需要得到纹理:

  • 512×512(1级)
  • 256×256(2级)
  • 128×128(3级)

OpenGL任何API从纹理贴图阵列访问纹理?

回答

2

Full 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_A1RGB565。许多设备都具有扩展功能,可以添加对RGB8RGBA8等格式的支持。

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