最近在學習OpenGL的紋理座標時,有一個疑惑就是紋理座標範圍大於1的概念一直沒有搞懂是什麼意思,通過這篇博客下面的圖示,明白了座標大於1就是說在場景中的模型,大於原來貼圖的尺寸時候的情況。下面是對這幾個環繞模式的具體解釋,原博客的地址:
http://blog.csdn.net/l_andy/article/details/53405758
在紋理映射中,紋理座標的範圍爲[0.0,1.0]。當紋理座標超出這個值時,OpenGL會根據你設置的環繞模式來處理這種情況。我們可以分別爲每個紋理座標軸(s,t,r)設置一個環繞模式,通過glTexParameteri 第二個參數爲GL_TEXTURE_WRAP_S,GL_TEXTURE_WRAP_T或者GL_TEXTURE_WRAP_R.環繞的模式有GL_REPEAT,GL_CLAMP,GL_CLAMP_TO_EDGE, GL_WRAP_TO_BORDER.
GL_REPEAT環繞模式只是簡單的重複紋理。例如:1.1出的紋理單元與0.1處的紋理單元是相同的。在平鋪式的紋理應用到大型幾何圖形的時候,非常有用。一個設計良好的無縫小型紋理緊挨着平鋪到大型幾何圖形上看起來像是無縫的大型紋理。
GL_CLAMP環繞模式是超過1.0的截取爲1.0。
如果環繞紋理的意義是是否對紋理進行重複那麼使用GL_REPEAT和GL_CLAMP兩種模式就足夠了。然而紋理的環繞模式,會影響到如何在紋理貼圖邊緣進行紋理過濾。對於GL_NEAREST過濾方式來講,紋理的環繞模式對它並沒有什麼影響,因爲紋理座標總是對應到紋理貼圖上的某一個單元。但對GL_LINEAR模式來說,紋理的環繞模式會影響它對紋理邊緣的處理效果。因爲它是對周圍的紋理元素作一個平均值。
對於GL_CLAMP截取型的環繞模式,還提供了一些選項來處理紋理邊緣。GL_CLAMP_TO_EDGE環繞模式簡單地忽略邊緣的紋理採樣,不把它們包括在平均值中。GL_CLAMP_TO_BORDER環繞模式在紋理座標在0.0到1.0範圍之外時只使用邊界紋理單元。邊界紋理單元是作爲圍繞基本圖像的額外的行和列,與基本紋理圖像一起加載的。
下圖顯示不同參數的效果:
將1張2*2的紋理(分別爲紅,綠,藍,黑),貼到一個方塊左下角。
方塊四個點的紋理座標依次指定爲(0,0), (2,0), (2,2), (0,2)。
根據上述的規則,座標將進行截取,截取到相應的範圍。
我們繪製暗白色線將紋理座標爲1的地方在圖中標註出來:
注:border顏色默認爲黑色
濾鏡:GL_NEAREST 纏繞模式:GL_CLAMP 或 GL_CLAMP_TO_EDGE
濾鏡:GL_NEAREST 纏繞模式:GL_CLAMP_TO_BORDER。
濾鏡:GL_LINEAR 纏繞模式:GL_CLAMP。
濾鏡:GL_NEAREST 纏繞模式:GL_CLAMP_TO_EDGE。
濾鏡:GL_NEAREST 纏繞模式:GL_CLAMP_TO_BORDER。