Mip映射

在3D的世界中我们往往要使用很多也就是一套图片来处理不同的transform后的模型图片。

百度百科中对Mia映射是这样解释的,也就一句话:

Mip映射 (Mip-mapping):Mip-mapping的核心特征是当物体的景深方向位置发生变化时,Mip映射根据不同的远近来贴上不同大小的材质贴图,比如近处贴512×512的大材质,而在远端物体贴上较小的贴图。这样不仅可以产生更好的视觉效果,同时也节约了系统资源。

那么在代码中怎么实现中效果呢?

其实很简单,首先准备好要上传的这个图片的纹理,然后通过对这个图片的宽和高进行进行每次一半的缩放,至到用来存放图片纹理的大小的宽高小于1就结束缩放,然后将每次缩放后的纹理上传给纹理对象。即可实现对一张图片上传一整套缩放的纹理图片。

具体的我们可以封装一个方法来实现对多张图片纹理的调用,以后更加的方便。

private function uploadTexturetextureImg:Class):Texture{
    var img:Bitmap = new textureImg);
    //创建一个纹理对象
    var texture:Texture = context3D.createTextureimg.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 BitmapDataw,h,true,0);
    whilew>=1&&h>=1){
        bmd.drawimg,marix,null,null,null,true);
        texture.uploadFromBitmapDatabmd,level);
        tracebmd.width+" "+bmd.height+" "+level);
        w>>=1;
        h>>=1;
        marix.scale0.5,0.5);
        level++;
        //清空,然后创建一个原来的1/2大小的bitmapdata
        bmd.dispose);
        ifw>=1&&h>=1){//如果没有这个判断会导致bmd无效
            bmd = new BitmapDataw,h,true,0);
        }
    }
}

我们在使用的时候就只许将内嵌的图片传进来就OK了……..

比如:

[Embedsource="asset/sky.jpg")] var Img3:Class;
只许如下即可:
var texture:Texture = uploadTextureImg);

搞定………………..吐舌笑脸

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注