日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android openGl纹理的使用

發布時間:2024/4/15 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT); gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT);


    在使用紋理的時候,有時候會出現超過紋理邊界的問題,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個參數。

    // 生成紋理 GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, mBitmap, 0);

    后三個參數含義如下

    - level———— 提供多種分辨率的紋理. 如紋理只有一種分辨率,level 則設置為0.- bitmap————Bitmap對象- border————邊框,設置為0


    6. 設置紋理頂點數據

    新建紋理浮點數組

    float texCoords[] = {0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, };

    這里要注意紋理坐標和OpenGL ES中坐標不一樣,它的原點位于左下角

    需要按照圖示方式連接

    再獲取紋理緩沖數組

    //獲取紋理緩沖數組TextureBuffer= Utils.getFloatBuffer(texCoords);

    這個其實就是把float轉成floatBuffer,分配的內存大小為數組的長度乘以4.


    最后設置紋理頂點數據

    // 設置紋理頂點數據gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, TextureBuffer);


    之前的講的比較復雜,下面把這些簡單總結一下。

    1) glGenTextures()
    生成紋理id,可以一次生成多個,后續操作紋理全靠這個id
    2) glBindTexture()
    操作紋理,傳入紋理id作為參數,每次bind之后,后續操作的紋理都是該紋理
    3) glTexParameteri()
    指定紋理格式。這里包括紋理橫向和縱向的重復方式
    GL_TEXTURE_WRAP_S
    GL_TEXTURE_WRAP_T

    和紋理在放大和縮小(同樣紋理離遠和離近)時的處理,這種設置主要是為了避免同一個紋理反復使用時,遠處的紋理反而比近處的清晰
    GL_TEXTURE_MAG_FILTER
    GL_TEXTURE_MIN_FILTER

    4) GLUtils.texImage2D()
    給紋理傳入圖像數據,至此,此紋理相關設置已經結束。后續想使用或者操作這個紋理,只要再glBindTexture這個紋理的id即可.

    下面給一個較為完整的例子

    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纹理的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。