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);