• 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);
    搞定………………..吐舌笑脸
  • 相关阅读:
    今天的温度还是有点高.....
    [React] 点击---图片90°旋转
    javascript onclick事件可以调用两个方法吗?
    vue 页面回退mounted函数不执行的问题及解决方法
    vue static和assets的区别
    js实现复制|剪切指定内容到粘贴板--clipboard
    纯前端html导出pdf--分页+不分页--html2canvas+jsPDF
    git常用命令行
    浅谈“观察者模式”那点小事儿
    [Linq] ORM
  • 原文地址:https://www.cnblogs.com/xhz-blog/p/3411433.html
Copyright © 2020-2023  润新知