在OpenGL中, 讓人很混亂的是有自訂產生的 int []textures, 也有GLES20.GL_TEXTURE0~31, 這些是作什麼用的呢,以及如何應用, 如何切換, 都將在本章進行說明
GLES20.glGenTexture
先看一下如下程式碼
int [] textures=new int[5]; GLES20.glGenTextures(5, textures, 0);
上述程式碼, 是跟顯卡要求5個記憶体區塊, 顯卡請會傳回五組編號放入textures陣列中. 致於每一區塊的大小則由顯卡管理, 不在作業系統的管轄範圍, 也不需知道如何管理.
GLES20.GL_TEXTURE
在OpenGL中, 規畫了32個通道, 供顯卡讀取資料並顯示渲染到螢幕上, 通道編號分別為0~31. 在shaderFrame中, gl_FragColor = texture2D(uTexture, vTexPosition);其中的uTexure就是指的要由那一個通道取得資料, 並顯示到螢幕上.
致於要由那個通道取得資料呢, 則由Java程式碼中的texture變數指定, 將 0 or 1 or 2 or …31傳給ShaderProgram中的uTexture變數即可
int textureHandle = GLES20.glGetUniformLocation(shaderProgram, "uTexture"); GLES20.glUniform1i(textureHandle, texture);
取得顯示資料
接下來, 顯示的圖片資料需要放到texture[0]…[4]之中. 如下程式碼中, 先由GLES20.glActiveTexture指名要設定那一個通道, 通道名稱可以由GLES20.GL_TEXTURE0+texture來指定. 然後再使用GLES20.glBindTexture()方法指定圖片將要存放的區塊(texture). 而真正開始存放資料的語法是由GLES20.glTexImage2D()來執行
GLES20.glActiveTexture(GLES20.GL_TEXTURE0+texture); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[texture]); GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, byteBuffer); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR ); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR ); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE ); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE );
預設
上述程式碼中第一行 glActiveTexture(GLES20.GL_TEXTURE+texture)是指定要設定那一個通道. 很多說明資料都沒有這行, 但也不會出錯. 因為系統預設為GL_TEXTURE0. 所以上述圖中, 所有的textures[0]~[4]都會與GL_TEXTURE0進行連結. 但最終只有最後連結者存在, 也就是只有textures[4]與通道0連結. 所以當渲染時, 就會由通道0取得texture[4]的資料. 如果要取得texture[2]的資料, 就需要glBindTexture(GLES20.GL_TEXTURE_2D, textures[2])一次, 才可以取得
增加效能
為了增加效能, 需於建構子讀取圖檔資料存入textures[x]前, 就先glActiveTextue()指定通道. 也就是說一個textures[x]指定一個GL_TEXTUREx通道
圖片資料更新
當圖片資料更新前, 一定要先用 glBindTexture()變更textures[]. 但當glBindTexture[]時, 又會跟GL_TEXTUREx進行連結. 所以若圖片一直變更時(如Camera), 就一定要先glActiveTexture, 再glBindTexture. 也就是說, 這二個要伴隨的出現.