OpenGL--紋理問題記錄

紋理的基礎知識請參閱LearnOpenGL的文章:
https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/

這裏記錄一下自己在使用紋理時候遇到的一些問題。

紋理圖像大小,2的n次方?

自己在查閱有些資料的時候,有些人在博客上寫了這樣的話:

OpenGL要求紋理的高度和寬度都必須是2的n次方大小,只有滿足這個條件,這個紋理圖片纔是有效的。

可能是博客時間的問題,只有在OpenGL2.0以下的版本,紋理的高度和寬度才必須爲2的n次方大小。

知乎問題:OpenGL es2.0之後對要渲染紋理的尺寸大小不限制2的次冪了嗎
叛逆者的回答:3.0纔不限制。2.0還是需要判斷是否有GL_OES_texture_npot這個擴展。
查詢擴展的方法glGetString(GL_EXTENSIONS), 看返回的字符串裏有沒有GL_OES_texture_npot

紋理環繞

紋理環繞方式如下圖:

之前在介紹blend的時候說到了,在使用blend的時候,需要將源顏色圖像(傳入的紋理)的環繞方式換爲:
- GL_CLAM_TO_EDGE
- 或者GL_CLAM_TO_BORDER
防止由於使用GL_REPEAT的時候紋理的邊緣部分插值而出現半透明的效果。

紋理過濾–各向異性紋理過濾

在執行紋理過濾操作時,正在使用的紋理一般會被放大或縮小,換句話說,就是紋理被貼到比它大或比它小的圖元上。紋理放大會使多個像素映射到一個texel,得到的圖像可能會有馬賽克。紋理縮小會使一個像素映射到多個texel,得到的圖像可能會模糊不清或有鋸齒。

各向異性過濾是最新型的過濾方法,它需要對映射點周圍方形8個或更多的像素進行取樣,獲得平均值後映射到像素點上。對於許多3D加速卡來說,採用8個以上像素取樣的各向異性過濾幾乎是不可能的,因爲它比三線性過濾需要更多的像素填充率。但是對於3D遊戲來說,各向異性過濾則是很重要的一個功能,因爲它可以使畫面更加逼真,自然處理起來也比mipmap過濾會更慢。

參考資料
如果使用一般的紋理過濾,當觀察方向跟模型表面不是相互垂直的的情況下,會出現紋理信息的丟失,表現爲圖像看上去比較模糊,如下圖所示,遠處場景的細節信息很差:

針對這種情況,可以採用各向異性過濾的方式處理紋理,在過濾紋理的時候,考慮到觀察角度不同,使紋理本身沿着模型表面傾斜的方向進行延伸。

使用如下語句查詢當前系統支持的最大各向異性過濾的數值,數值越大,表示沿着最大變化方向所採樣的紋理單元越多,顯示效果就越好:

GLfloat max_TexAni;    //查詢允許的各向異性數量  
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_TexAni);  
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_TexAni);  

效果圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章