當相機遠離模型時,模型也會變小.其紋理渲染採樣時會顆粒狀失真.解決失真問題關鍵在於讓屏幕中體積較小物體或遠離視點時.使用低分辯率『紋理Texture』圖像.稱值為紋理鏈.首先獲取紋理尺寸.然後創建比小分辨率紋理圖,把分辨率縮小一半.重複這一過程直到分辨率為1.為了在OpenGL ES使用紋理鏈,需要執行以下兩步
- 將縮小係數過濾器設置為GL_XXX_MIPMAP_XXX這裡設置為如果不使用MIPMAP.只會使用首個紋理
- 通過縮小紋理創建圖鏈.並將圖片上傳提交給OpenGL ES.作為當前圖層.圖層從0開此,0圖層為原始圖層,然後上傳圖層.然後將其寬度與高除以2不斷創建縮小圖層並上傳.回收位圖.直到寬與高等於零.最後一張紋理1*1像素.則退出循環.並且紋理鏈只能綁定單一紋理
- 對於3D模形使用紋理鏈mipmap,而在2D材質無需應用
- 若啟用mipmap所繪製物較小.性能提升較明顯.因為GPU只需從小圖片中提取紋理元素
- 若啟用mipmap紋理鏈會比沒有使用多佔用33%記憶體.但可換來視角效果提升.特別對遠景物體可修正粒狀失真.
- mipmap紋理鏈僅對正方形紋理有效.並且僅在OpenGL ES 1.x獲得支持.
紋理位圖載入與綁定.在其基礎加入紋理鏈代碼
GL10 gl = GRAPHICS.gl;
生成空的紋理對象,並獲取id
gl.glGenTextures(1, ids,0);
int id = ids[0];
讀取紋理圖
Bitmap bitmap = BITMAP.Read(file_name);
綁定紋理ID
gl.glBindTexture(GL10.GL_TEXTURE_2D, id);
設置紋理屬性,紋理過濾器,指定縮小倍數過濾器
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR_MIPMAP_NEAREST);
指定放大倍數過濾器
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
獲取紋理寬度與高度
int width = bitmap.getWidth();
int height = bitmap.getHeight();
原始圖層索引為0
int level = 0;
while(true) {
上傳紋理
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, level, bitmap, 0);
圖層索引號加一
++level;
計算縮小一半紋理位圖寬與高
int newWidth = bitmap.getWidth()/2;
int newHeight = bitmap.getHeight()/2;
寬與高等於零時跳出循環
if(newWidth == 0)
break;
創建縮小一半紋理位圖
Bitmap newBitmap = Bitmap.createBitmap(newWidth,newHeight,bitmap.getConfig());
Canvas canvas = new Canvas(newBitmap);
canvas.drawBitmap(bitmap,
new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()),
new Rect(0,0,newWidth,newHeight),
null);
回收位圖資源
bitmap.recycle();
bitmap = newBitmap;
}
取消邦定紋理ID
gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
回收位圖資源
bitmap.recycle();
你必須登入才能發表留言。