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