紋理映射
紋理映射
紋理映射(Texture Mapping),又稱紋理貼圖,是將紋理空間中的紋理像素映射到屏幕空間中的像素的過程。簡單來說,就是把一幅圖像貼到三維物體的表面上來增強真實感,可以和光照計算、圖像混合等技術結合起來形成許多非常漂亮的效果。
紋理映射
在三維圖形中,紋理映射(Texture Mapping)的方法運用得最廣,尤其描述具有真實感的物體。比如繪製一面磚牆,就可以使用一幅具有真實感的圖像或者照片作為紋理貼到一個矩形上,這樣,一面逼真的磚牆就畫好了。如果不用紋理映射的方法,這牆上的每一塊磚都要作為一個獨立的多邊形來繪製。另外,紋理映射能夠保證在變換多邊形時,多邊形上的紋理也會隨之變化。例如,用透視投影模式觀察牆面時,離視點遠的牆壁的磚塊的尺寸就會縮小,而離視點近的就會大些,這些是符合視覺規律的。此外,紋理映射也被用在其他一些領域。如飛行模擬中常把一大片植被的圖像映射到一些大多邊形上用以表示地面,或者用大理石、木材等自然物質的圖像作為紋理映射到多邊形上表示相應的物體。
紋理映射是真實感圖像製作的一個重要部分,運用它可以方便的製作出極具真實感的圖形而不必花過多時間來考慮物體的表面細節。然而紋理載入的過程可能會影響程序運行速度,當紋理圖像非常大時,這種情況尤為明顯。如何妥善的管理紋理,減少不必要的開銷,是系統優化時必須考慮的一個問題。還好,OpenGL提供了紋理對象對象管理技術來解決上述問題。與顯示列表一樣,紋理對象通過一個單獨的數字來標識。這允許OpenGL硬體能夠在內存中保存多個紋理,而不是每次使用的時候再載入它們,從而減少了運算量,提高了速度。
使用紋理對象的步驟如下:
第一步:定義紋理對象
const int TexNumber4;
GLuint mes_Texture[TexNumber]; //定義紋理對象數組
第二步:生成紋理對象數組
glGenTextures(TexNumber,m_Texture);
第三步:通過使用glBindTexture選擇紋理對象,來完成該紋理對象的定義。
glBindTexture(GL_TEXTURE 2D,m_Texture);
glTexImage2D(GL_TEXTURE_2D,0,3,mes_Texmapl.GetWidth(),mee_Texmapl.GetHeight()
,0,GL_BGR_EXT,GL_UNSIGNED_BYTE,mse_Texmapl.GetDibBitsl'trQ);
第四步:在繪製景物之前通過glBindTexture,為該景物載入相應的紋理。
glBindTexture(GLes_TEXTURE_2D,mse_Texture);
第五步:在程序結束之前調用glDeleteTextures刪除紋理對象。
glDeleteTextures(TexNumber, mee_Texture);
這樣就完成了全部紋理對象的管理和使用。
二維紋理映射就是從二維紋理平面到三維物體表面的映射。一般二維紋理平面是有範圍限制的,在這個平面區域內,每點都可用數學函數表達,從而可以離散的分離出每點的灰度值和顏色值,這個平面區域稱為紋理空間,一般將紋理空間的平面區域定義在[0, 1] * [0, 1]。
兩步法紋理建模
1986年, Bier和Sloan提出了一種獨立於物體表面的紋理影射技術,將紋理空間到物體空間的映射分為兩個簡單的映射複合。兩步法紋理映射的核心是引進一個包圍物體的中介三維曲面作為中間映射媒體,主要過程分兩步:
(a). 將二維紋理映射到一個簡單的三維物體表面,如平面,球面,圓柱面,立方體表面,採用不同的中間映射媒體生成的紋理效果是不同的,要根據目標物體表面來選擇。
S : (u, v) --> (x', y', z') --- S-映射
如半徑為R的球的S-映射為:
x = R * cos a * sin b
y = R * sin a * sin b
z = R * cos b
(0 <= a <= 2PI, 0<= b <= PI)
(b). 將(a)的三維物體表面上的紋理映射到目標物體表面,
O : (x', y', z') --> (x, y, z) --- O-映射