紋理座標

當我們繪製一個三角形時,只需要指定三個頂點的顏色。三角形中其它各點的顏色不需要我們指定,這些點的顏色是OpenGL自己通過計算得到的。在我們學習OpneGL光照時,法線向量、材質的指定,都是只需要在頂點處指定一下就可以了,其它地方的法線向量和材質都是OpenGL自己通過計算去獲得。紋理的使用方法也與此類似。只要指定每一個頂點在紋理圖象中所對應的像素位置,OpenGL就會自動計算頂點以外的其它點在紋理圖象中所對應的像素位置。這聽起來比較令人迷惑。我們可以這樣類比一下:在繪製一條線段時,我們設置其中一個端點爲紅色,另一個端點爲綠色,則OpenGL會自動計算線段中其它各像素的顏色,如果是使用glShadeMode(GL_SMOOTH);,則最終會形成一種漸變的效果(例如線段中點,就是紅色和綠色的中間色)。類似的,在繪製一條線段時,我們設置其中一個端點使用“紋理圖象中最左下角的顏色”作爲它的顏色,另一個端點使用“紋理圖象中最右上角的顏色”作爲它的顏色,則OpenGL會自動在紋理圖象中選擇合適位置的顏色,填充到線段的各個像素(例如線段中點,可能就是選擇紋理圖象中央的那個像素的顏色)。我們在類比時,使用了“紋理圖象中最左下角的顏色”這種說法。但這種說法在很多時候不夠精確,我們需要一種精確的方式來表示我們究竟使用紋理中的哪個像素。紋理座標也就是因爲這樣的要求而產生的。以二維紋理爲例,規定紋理最左下角的座標爲(0, 0),最右上角的座標爲(1, 1),於是紋理中的每一個像素的位置都可以用兩個浮點數來表示(三維紋理會用三個浮點數表示,一維紋理則只用一個即可)。使用glTexCoord*系列函數來指定紋理座標。這些函數的用法與使用glVertex*系列函數來指定頂點座標十分相似。例如:glTexCoord2f(0.0f, 0.0f);指定使用(0, 0)紋理座標。通常,每個頂點使用不同的紋理,於是下面這樣形式的代碼是比較常見的。

glBegin( /* ... */ );
    glTexCoord2f( /* ... */ ); glVertex3f( /* ... */ );
    glTexCoord2f( /* ... */ ); glVertex3f( /* ... */ );
    /* ... */
glEnd();

當我們用一個座標表示頂點在三維空間的位置時,可以使用glRotate*等函數來對座標進行轉換。紋理座標也可以進行這種轉換。只要使用glMatrixMode(GL_TEXTURE);,就可以切換到紋理矩陣(另外還有透視矩陣GL_PROJECTION和模型視圖矩陣GL_MODELVIEW,詳細情況在第五課有講述),然後glRotate*,glScale*,glTranslate*等操作矩陣的函數就可以用來處理“對紋理座標進行轉換”的工作了。在簡單應用中,可能不會對矩陣進行任何變換,這樣考慮問題會比較簡單。
發佈了32 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章