天天看點

OpenGL紋理過濾以及紋理Wrapping mode

 在三維動态場景中,如果一個紋理對象迅速地遠離觀察點而去,此時紋理圖像必須随被投影的圖像一起縮小,否則很産生抖動或者閃爍的現象。為了避免産生抖動或者閃爍,OpenGL必須對紋理圖像進行過濾,适當的對它進行縮小,是它在映射到無替代 表面時,不會産生令人不快的人工視覺效果。為了避免這種效果,我們可以指定一系列預先過濾的分辨率遞減的問題圖像,成為mipmap。mipmap使用了一些精巧的方法把圖像資料挑選到記憶體中。

圖象從紋理圖象空間映射到幀緩沖圖象空間(映射需要重新構造紋理圖像,這樣就會造成應用到多邊形上的圖像失真),這時就可用glTexParmeteri()函數來确定如何把紋理象素映射成像素. 部分參數功能說明如下: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); GL_TEXTURE_2D: 操作2D紋理. GL_TEXTURE_WRAP_S: S方向上的貼圖模式. GL_CLAMP: 将紋理坐标限制在0.0,1.0的範圍之内.如果超出了會如何呢.不會錯誤,隻是會邊緣拉伸填充. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);這裡同上,隻是它是T方向 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);這是紋理過濾 GL_TEXTURE_MAG_FILTER: 放大過濾 GL_LINEAR: 線性過濾, 使用距離目前渲染像素中心最近的4個紋素權重平均值. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); GL_TEXTURE_MIN_FILTER: 縮小過濾 GL_LINEAR_MIPMAP_NEAREST: 使用GL_NEAREST對最接近目前多邊形的解析度的兩個層級貼圖進行采樣,然後用這兩個值進行線性插值. 紋理帖圖會出現在物體表面的(u,v)位置上,這些值在[0.0,1.0]範圍内。超出這個值域怎麼去辦呢,在OpenGL中用Texture Wrapping 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):圖象在物體表面上不斷重複,但是每次重複的時候對圖象進行鏡像或者反轉。這樣在紋理邊緣處比較連貫。 4. 邊界截取(CLAMP_TO_BORDER_ARB):[0.0,1.0]範圍外的參數值用單獨定義的邊界顔色或紋理邊緣進行繪制。适合于繪制物體表面的貼花紙。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的效果好象是一樣的。

繼續閱讀