Mip映射
在3D的世界中我们往往要使用很多也就是一套图片来处理不同的transform后的模型图片。
百度百科中对Mia映射是这样解释的,也就一句话:
Mip映射 (Mip-mapping):Mip-mapping的核心特征是当物体的景深方向位置发生变化时,Mip映射根据不同的远近来贴上不同大小的材质贴图,比如近处贴512x512的大材质,而在远端物体贴上较小的贴图。这样不仅可以产生更好的视觉效果,同时也节约了系统资源。
那么在代码中怎么实现中效果呢?
其实很简单,首先准备好要上传的这个图片的纹理,然后通过对这个图片的宽和高进行进行每次一半的缩放,至到用来存放图片纹理的大小的宽高小于1就结束缩放,然后将每次缩放后的纹理上传给纹理对象。即可实现对一张图片上传一整套缩放的纹理图片。
具体的我们可以封装一个方法来实现对多张图片纹理的调用,以后更加的方便。
private function uploadTexture(textureImg:Class):Texture{ var img:Bitmap = new textureImg(); //创建一个纹理对象 var texture:Texture = context3D.createTexture(img.width,img.height,Context3DTextureFormat.BGRA,false); //上传mip映射(从2的n次幂到1,上传一套纹理) var w:int = img.width; var h:int = img.height; var level:int = 0; var marix:Matrix = new Matrix(); marix.identity(); //创建一个bitmapdata来绘制每个级别的mip映射像素 var bmd:BitmapData = new BitmapData(w,h,true,0); while(w>=1&&h>=1){ bmd.draw(img,marix,null,null,null,true); texture.uploadFromBitmapData(bmd,level); trace(bmd.width+" "+bmd.height+" "+level); w>>=1; h>>=1; marix.scale(0.5,0.5); level++; //清空,然后创建一个原来的1/2大小的bitmapdata bmd.dispose(); if(w>=1&&h>=1){//如果没有这个判断会导致bmd无效 bmd = new BitmapData(w,h,true,0); } } }
我们在使用的时候就只许将内嵌的图片传进来就OK了……..
比如:
[Embed(source="asset/sky.jpg")] var Img3:Class; 只许如下即可: var texture:Texture = uploadTexture(Img);