android openGl纹理的使用
今天,簡單講講android關(guān)于紋理的知識。
一、紋理的概念
紋理(texture) 在游戲制作里面指貼圖,計算機圖形學(xué)中的紋理既包括通常意義上物體表面的紋理即使物體表面呈現(xiàn)凹凸不平的溝紋,同時也包括在物體的光滑表面上的彩色圖案。
OpenGL中的紋理可以用來表示圖像,照片,甚至由一個數(shù)學(xué)算法生成的分形數(shù)據(jù)。每個二維的紋理都由許多小的紋理元素組成,它們是小塊的數(shù)據(jù),類似于我們前面討論過的片段和像素。要使用紋理,最常用的方式是直接從一個圖像文件加載數(shù)據(jù)。
二、添加紋理
添加紋理分為以下幾個步驟
1. 打開紋理開關(guān)
// 啟動紋理坐標數(shù)據(jù)gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);//打開紋理gl.glEnable(GL10.GL_TEXTURE_2D);
2. 創(chuàng)建紋理
先要創(chuàng)建紋理名稱數(shù)組
//紋理名稱數(shù)組 int [] textureids = new int[1];
然后
//創(chuàng)建紋理gl.glGenTextures(1, textureids, 0);
傳入3個參數(shù)
void glGenTextures(int n, //數(shù)量int[] textures, //紋理名稱數(shù)組int offset //偏移量);
3. 綁定紋理
前一個參數(shù)固定,后一個傳入數(shù)組元素
//綁定紋理 gl.glBindTexture(GL10.GL_TEXTURE_2D, textureids[0]);
有兩個參數(shù)需要設(shè)置下,當紋理比被渲染區(qū)域大或者小時,要設(shè)置紋理放大或者縮小情況下,OpenG紋理過濾模式
1.
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); 1有以下幾種
- GL_NEAREST————最近鄰過濾- GL_NEAREST_MIPMAP_NEAREST————使用MIP貼圖的最近鄰過濾- GL_NEAREST_MIPMAP_LINEAR————使用MIP貼圖級別之間插值的最近鄰過濾- GL_LINEAR————雙線性過濾- GL_LINEAR_MIPMAP_NEAREST————使用MIP貼圖的雙線性過濾- GL_LINEAR_MIPMAP_LINEAR————三線性過濾(使用MIP貼圖級別之間插值的雙線性過濾)
2.
在使用紋理的時候,有時候會出現(xiàn)超過紋理邊界的問題,GL_TEXTURE_WRAP系列參數(shù)用來設(shè)置當這些超出邊界時應(yīng)該怎樣處理。
- GL_TEXTURE_WRAP_S————S方向(X方向)- GL_TEXTURE_WRAP_T————T方向(Y方向)
第三個參數(shù)有以下幾種
- GL_REPEAT————重復(fù)邊界的紋理- GL_CLAMP————opengl就在一個2X2的加權(quán)紋理單元數(shù)組中使用取自邊框的紋理單元。這時候的邊框如果沒有設(shè)置的話,應(yīng)該就是原紋理的邊界的像素值- GL_CLAMP_TO_EDGE————邊框始終被忽略。位于紋理邊緣或者靠近紋理邊緣的紋理單元將用于紋理計算,但不使用紋理邊框上的紋理單元- GL_CLAMP_TO_BORDER————如果紋理坐標位于范圍[0,1]之外,那么只用邊框紋理單元(如果沒有邊框,則使用常量邊框顏色,我想常量邊框顏色就是黑色)用于紋理
5. 生成紋理
先獲取到Bitmap
mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.texture_img);然后調(diào)用GLUtils的texImage2D方法,傳入4個參數(shù)。
后三個參數(shù)含義如下
- level———— 提供多種分辨率的紋理. 如紋理只有一種分辨率,level 則設(shè)置為0.- bitmap————Bitmap對象- border————邊框,設(shè)置為0
6. 設(shè)置紋理頂點數(shù)據(jù)
新建紋理浮點數(shù)組
這里要注意紋理坐標和OpenGL ES中坐標不一樣,它的原點位于左下角
需要按照圖示方式連接
再獲取紋理緩沖數(shù)組
//獲取紋理緩沖數(shù)組TextureBuffer= Utils.getFloatBuffer(texCoords);這個其實就是把float轉(zhuǎn)成floatBuffer,分配的內(nèi)存大小為數(shù)組的長度乘以4.
最后設(shè)置紋理頂點數(shù)據(jù)
// 設(shè)置紋理頂點數(shù)據(jù)gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, TextureBuffer);
之前的講的比較復(fù)雜,下面把這些簡單總結(jié)一下。
1) glGenTextures()GL_TEXTURE_WRAP_S
GL_TEXTURE_WRAP_T
和紋理在放大和縮小(同樣紋理離遠和離近)時的處理,這種設(shè)置主要是為了避免同一個紋理反復(fù)使用時,遠處的紋理反而比近處的清晰
GL_TEXTURE_MAG_FILTER
GL_TEXTURE_MIN_FILTER
下面給一個較為完整的例子
int[] textureHandle = new int[1]; GLES20.glGenTextures(1, textureHandle, 0); int TextureID = textureHandle[0]; GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, TextureID); 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);GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
android openGl紋理的使用就講完了。
就這么簡單。
總結(jié)
以上是生活随笔為你收集整理的android openGl纹理的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android byteBuffer的使
- 下一篇: android Map集合的遍历