Android OpenGL es 紋理座標設定與貼圖規則(轉載)

原文地址:http://blog.csdn.net/cjkwin/article/details/6016224

當opengl對一個四方形進行貼圖時,會定義紋理貼圖座標,一串數組,相信初學openggl es者看到後會很頭疼,不知道寫得是什麼東西。現在就將我的研究成果與大家分享下!

當紋理映射啓動後繪圖時,你必須爲OpenGL ES提供其他數據,即頂點數組中各頂點的紋理座標。紋理座標定義了圖像的哪一部分將被映射到多邊形。它的工作方式有點奇怪。 

下面看下在android平臺下Opengl紋理系統座標,左下角爲原點。

我們現在討論怎樣使用這些紋理座標。當我們指定頂點數組中的頂點時,我們需要在另一個數組中提供紋理座標,它稱爲紋理座標數組。這裏需要注意定義座標數組順序,這很關鍵。

 

 

 

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

效果如下:

 

如果我們想截取圖片有上角不分做紋理,按照上面方法可獲的數組

float texCoords[] = new float[] {
   // FRONT
           0.5f, 0.5f,
          1f, 0.5f,
          0.5f, 1f,
          1f, 1f
  };

效果如下:

 

 

我們看下貼圖的原始文件

你會發現截屏中的圖片y軸是顛倒的,其實這是android圖像座標系統與Opengl es 座標系統不一致導致的。最簡單的修正辦法將原始圖片用工具翻轉過來,這樣會比用程序翻轉節省很多性能,資源是寶貴的。

三角形紋理映射,只要按照我們的映射規則,便可以順利完成映射。

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

效果:

 

看到這裏應該知道紋理座標數組規則定義的意義了吧。

 

平鋪與箔拉

我們的紋理座標系統在兩個軸上都是從0.0 到 1.0,如果設置超出此範圍的值會怎麼樣?根據視圖的設置方式有兩種選擇。

平鋪(也叫重複)
一種選擇是平鋪紋理。按OpenGL的術語,也叫“重複”。如果我們將第一個紋理座標數組的所有1.0改爲2.0:
    static const GLfloat texCoords[] = {
        0.0, 2.0,
        2.0, 2.0,
        0.0, 0.0,
        2.0, 0.0
    };

我們可以通過glTexParameteri()函數設置。

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);

 

箝位
另一種可能的選擇是讓OpenGL ES簡單地將超過1.0的值限制爲1.0,任何低於0.0的值限制爲 0.0。這實際會引起邊沿像素重複。

我們可以通過glTexParameteri()函數設置。

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);


注:原作者寫的UV左邊,需要將原圖片進行處理,如果將UV座標寫成

private float texture[] = {    
// Mapping coordinates for the vertices
0.0f, 1.0f, // top left (V2)
0.0f, 0.0f, // bottom left (V1)
1.0f, 1.0f, // top right (V4)
1.0f, 0.0f // bottom right (V3)
};
就不需要將原圖片進行處理了。

發佈了16 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章