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);
搞定………………..吐舌笑脸
posted @ 2013-11-06 22:27  重庆-崽崽  阅读(758)  评论(0编辑  收藏  举报