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);
效果圖: