第五章 GL_TEXTURE

      在〈第五章 GL_TEXTURE〉中尚無留言

在OpenGL中, 讓人很混亂的是有自訂產生的 int []textures, 也有GLES20.GL_TEXTURE0~31, 這些是作什麼用的呢,以及如何應用, 如何切換, 都將在本章進行說明

GLES20.glGenTexture

先看一下如下程式碼

int [] textures=new int[5];
GLES20.glGenTextures(5, textures, 0);

上述程式碼, 是跟顯卡要求5個記憶体區塊, 顯卡請會傳回五組編號放入textures陣列中. 致於每一區塊的大小則由顯卡管理, 不在作業系統的管轄範圍, 也不需知道如何管理.

gltexture_0

GLES20.GL_TEXTURE

在OpenGL中, 規畫了32個通道, 供顯卡讀取資料並顯示渲染到螢幕上, 通道編號分別為0~31. 在shaderFrame中,  gl_FragColor = texture2D(uTexture, vTexPosition);其中的uTexure就是指的要由那一個通道取得資料, 並顯示到螢幕上.

gltexture_1

致於要由那個通道取得資料呢, 則由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 );

gltexture_2

預設

上述程式碼中第一行 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. 也就是說, 這二個要伴隨的出現.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *