2014-11-16 119 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表面,則使用此方法將失去精確性。