http://www.wangchao.net.cn/bbsdetail_274291.html
在進行紋理帖圖時,圖象會出現在物體表面的(u,v)位置上,而這些值在[0.0,1.0]範圍內。但是,如果超出這個範圍,會發生什麼情況呢?這由紋理的映射函數來決定。在OpenGL中,這類映射函數稱為“Texture Wrapping Mode”;在D3D中,稱為“Texture Addressing Mode”。常見的有下面幾種:
1. 重複(GL_REPEAT):圖象在表面上重複出現。在演算法上,忽略紋理座標的整數部分,並將紋理圖的拷貝粘貼在物體表面上。對於大多數複製紋理的使用,在紋理頂部的紋理單元應與底部的紋理單元相匹配,在紋理左側的紋理單元也應與右側的紋理單元相匹配。這樣才能做到無縫串連。
2. 截取(GL_CLAMP):將大於1.0的數值設定為1.0,將小於0.0的數值設定為0.0,即將超出[0.0,1.0]範圍的數值截取到[0.0,1.0]範圍內,這樣會導致紋理邊緣的重複。
3. 鏡像重複(GL_MIRRORED_REPEAT_ARB):圖象在物體表面上不斷重複,但是每次重複的時候對圖象進行鏡像或者反轉。這樣在紋理邊緣處比較連貫。在OpenGL中通過ARB_texture_mirrored_repeat擴充來實現。
4. 邊界截取(CLAMP_TO_BORDER_ARB):在[0.0,1.0]範圍外的參數值用單獨定義的邊界顏色或紋理邊緣進行繪製。適合於繪製物體表面的貼花紙。在OpenGL中通過ARB_texture_border_clamp擴充來實現,CLAMP_TO_BORDER_ARB在所有mipmap層次上對紋理座標進行截取,使nearest和linear過濾只返回邊界紋理單元的顏色。
5. 邊緣截取(GL_CLAMP_TO_EDGE):總是忽略邊界。處於紋理邊緣或者靠近紋理邊緣的紋理單元都用作紋理計算,但是不包括邊界上的紋理單元。
在OpenGL1.2以前的版本中並未對最初的GL_CLAMP進行詳細的說明。按照定義,在雙線性插值過程中,在紋理邊界以外的點是由紋理邊緣像素和邊界顏色各自一半混合形成的。在OpenGL1.2中,引入了GL_CLAMP_TO_EDGE,用來糾正這個問題。同時,GL_CLAMP_TO_BORDER_ARB則只對那些紋理邊界上的邊界點進行採樣。但是,因為很多硬體並不支援邊界處理,所以實現GL_CLAMP_TP_EDGE和GL_CLAMP的效果好象是一樣的。新出現的硬體(如GeForce3)正確實現了GL_CLAMP,但是結果通常並不是所期望的。