zoukankan      html  css  js  c++  java
  • 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);
    搞定………………..吐舌笑脸
  • 相关阅读:
    shell脚本基础
    rtsp冷门解释
    C++基础之动态内存
    树莓派3安装ros
    Trie树
    [LeetCode]The Skyline Problem
    [LeetCode]Implement Trie (Prefix Tree)
    C++基础之适配器
    配置树莓派3的openwrt中的网络
    [LeetCode]Self Crossing
  • 原文地址:https://www.cnblogs.com/xhz-blog/p/3411433.html
Copyright © 2011-2022 走看看