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