精华内容
下载资源
问答
  • Unity3D mipmap

    2020-11-04 10:59:44
    5.1 Mipmap和过滤 当纹理的像素(texels)与投影到的像素不完全匹配的时候,会发生什么?这会造成一定的不匹配,这必须以某种方式解决。 这就是通过过滤模式索要控制的内容。 最直接的过滤模式是点模式(无...

    转载自:catlike coding和雨松momo

    Mipmap和过滤


    当纹理的像素(texels)与投影到的像素不完全匹配的时候,会发生什么?这会造成一定的不匹配,这必须以某种方式解决。 这就是通过过滤模式索要控制的内容。


    最直接的过滤模式是点模式(无滤波器)。这意味着在对纹理进行采样的时候,某些UV坐标会使用离它最近的纹理。这将给纹理块状的外观,除非纹理的像素恰好映射到显示像素。 因此,它通常用于像素的完美渲染,或者当需要块状样式的时候。


    默认是使用双线性滤波。当纹理在两个纹理像素之间的某处被采样的时候,这两个纹理像素会被进行内插值。由于纹理是二维的,这会沿着U和V轴发生内插值。 因此,双线性滤波不只是线性滤波。


    当纹理像素的密度小于显示像素的密度时,这个方法会起作用,因此当你放大纹理的时候,结果会看起来模糊。在相反的情况下这个方法不会起作用,比如说当你缩小的纹理的时候。 相邻的显示像素中的空间将多于一个纹理像素。这意味着纹理的一部分将被跳过,这将导致效果不好的转换,就好像图像被锐化一样。


    这个问题的解决方案是每当纹理像素的密度变得太高的时候会使用较小的纹理。 显示屏上显示的纹理越小,那么应该使用的版本就越小。这些较小的版本称为mipmaps,并且会自动为你生成。每个连续的mipmap具有上一级mipmap的宽度和高度的一半。因此,当原始的纹理大小为512x512的时候,mip映射依次是256x256,128x128,64x64,32x32,16x16,8x8,4x4和2x2。

    如果你喜欢的话,你可以禁用mipmap。首先,将纹理类型设置为高级。然后你可以禁用Mipmap并进行更改。 看到差异的一个好方法是使用像四边形的平面对象,并从一个固定的角度去看它。
     

    在有mipmap和没有mipmap时候的情况。


     那么在哪里使用哪个mipmap级别,它们看起来有多不同?通过在高级纹理设置中启用Fadeout Mip贴图,我们可以使过渡可见。在启用Fadeout Mip贴图的时候,渐变范围滑块将显示在检查器中。它定义了一个mipmap范围,mipmap映射范围将过渡到纯灰色。通过使这个过渡单步展现,你会得到一个尖锐的过渡一直到灰色。进一步将单步范围向右移动,后面的转换将会发生。

     

    对mipmap的高级设置。


    褪色到灰色的用途是什么?

     

    要获得此效果的良好视图,现在将纹理的Aniso等级l设置为0。
     

    连续的mipmap级别。


    一旦你知道了各种mipmap的级别,你应该能够看到他们之间纹理质量的突然变化。 随着纹理投影的变小,纹理像素的密度会增加,这使得它看起来更清晰。 直到突然下一个mipmap等级切换,它就又变得模糊了。


    所以在没有mipmap的情况下,你看到的视觉效果是从模糊到锐利,再到太尖锐。而在有mipmap的情况下,你看到的视觉效果是从模糊到尖锐,再到突然再次模糊,然后尖锐,再次突然模糊,等等。


    那些模糊锐利是双线性滤波的特征。你可以通过将过滤器模式切换到三线性滤波来消除那些模糊锐利。这与双线性过滤的原理相同,但它也在相邻的mipmap级别之间内插。因此得名三线性滤波。这使得采样更昂贵,但它平滑了mipmap级别之间的过渡。
     

    正常和灰色mipmap之间的三线性滤波。


    另一个有用的技术是各向异性过滤。你可能已经注意到,当你设置为0的时候,纹理变得模糊。这与mipmap级别的选择有关。

    当纹理以一个角度进行投射时,由于透视,你最终得到的结果是它的一个维度变形比另一个维度变形更大。一个很好的例子是纹理的地平面。在一定距离处,纹理的前-后尺寸将显得比左-右尺寸小得多。

    而选择哪个mipmap级别是基于最差维度进行选择的。如果差异很大的话,那么你将得到在一个维度上非常模糊的结果。各向异性过滤通过对尺寸的去耦合来减轻这种影响。除了均匀地缩小纹理外,它还提供在任一维度上缩放不同比例的版本。 所以你不只是有一个大小为256x256的mipmap,也有大小为256x128、256x64的mipmap等等。

     

    不使用各向异性过滤和使用各向异性过滤的对比。


    注意,那些额外的mipmap不像常规的mipmap那样是预先生成的。相反,它们通过执行额外的纹理采样来进行模拟。所以他们不需要更多的空间,但是采样变得更昂贵了。

     

    各向异性双线性滤波,逐步过滤为灰色。


    各向异性过滤的深度是由Aniso的等级进行的控制。在Aniso的等级为0的时候,代表着禁用各向异性过滤。 在Aniso的等级为1的时候,启用各向异性过滤并提供最小的效果。在Aniso的等级为16的时候,各向异性过滤处于其最大值。但是,这些设置受项目质量设置的影响。

     

    你可以通过Edit / Project Settings / Quality来访问质量设置。你将在“渲染”部分中找到各向异性纹理的设置。
     

    渲染质量设置。


    当禁用各向异性纹理的时候,就不会发生各向异性过滤,无论纹理的设置如何。 当它设置为”Per Texture”的时候,各向异性过滤是否起起用完全由每个单独的纹理控制。它也可以设置为强制开启,这将使得每个纹理的Aniso 等级至少设置为9。但是,Aniso 等级设置为0的纹理仍然不会使用各向异性过滤。

     

     

     

    GPU发热的元凶之一“带宽” 所以通常我们都会打开mipmap,如下图所示,在unity中可以拖动右上角的条来查看贴图每个等级的mipmap贴图。那么它的等级一共分成0级-9级, 0级表示最清楚,9级表示最模糊。 贴图分辨率是依次减半,如512 256 128 64 32 16 8 4 2 0

     

    所以说如果带了mipmap的贴图在内存上就会多占33%左右,然而显存和纹理带宽就不一定了,如果摄像机离得比较远,就会采用更小的贴图渲染,贴图所占显存小了,那么对应纹理带宽也一并减小,从而性能就优化了。

    也有团队为了减少内存,从而关闭了mipmap。这就会导致另一个问题,美术的贴图非常精细,在UI中近距离观察效果很好,可是一旦摄像机拉远,就会出现“噪点”很难看。 所以mipmap一定要打开。

    总体来说mipmap是用内存换纹理带宽的一种优化方式。可是内存毕竟涨了33%,所以unity2018.2中提供了streaming流加载贴图mipmap,意思就是用到哪一级mipmap只加载这一级的,其他级的mipmap不加载。这将大量减少内存开销,如下图所示,unity提供了一个demo例子,内存大概减少25%-30%。

     

    到这里大家应该都能很好理解流加载,其实本篇文章我想说的是利用流加载的特性来进一步优化纹理带宽。例如,

    1.unity原本默认计算出需要加载第0级的mipmap贴图,我们能不能手动设置成别的级别mimap

    2.比如打开非全屏界面,能不能强制将游戏里面所有3D物体的mipmap都降到最低

    答案是可行的,有了这两个特性,我们就可以自己灵活控制mipmap按需加载了。

    首先我们需要在unity中开启texture streaming,如下图所示,在Quality Setting面板中勾选Texture Streaming,请注意Max Level Reduction这个数值比较重要,它的意思就是mipmap最多可以减小几级,最大是7.默认是2,如果是2的话,那么代码里怎么设置最多只能减少2级.

     

    Max Level Reduction代码中也可以动态修改。

    1

    2

            //mipmap最多可以减少的等级, 默认是2 ,也可以在QualitySettings面板中设置

            QualitySettings.streamingMipmapsMaxLevelReduction = 7;

    还需要在Editor Settings中勾选 Enable Texture Streaming,我的测试中即使勾选在编辑器下也未必能有正确的结果,所以大家一定要打出包在真机中查看。

     

    如下代码所示,首先实例化一个Prefab,并且调用requestedmipmaplevel来设置默认加载mipmap的等级。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

        void Start()

        {

            mr = Instantiate<GameObject>(prefab).GetComponent<MeshRenderer>();

            t1 = mr.material.mainTexture as Texture2D;

            t1.requestedMipmapLevel = 5; //加载第5等级mipmap

            //t1.ClearRequestedMipmapLevel();可以清空加载mipmap的等级

            

        }

        void OnGUI()

        {

            GUILayout.Label("<size=50>desiredMipmapLevel" + t1.desiredMipmapLevel + "</size>");

            GUILayout.Label("<size=50>calculatedMipmapLevel" + t1.calculatedMipmapLevel + "</size>");

            GUILayout.Label("<size=50>loadedMipmapLevel" + t1.loadedMipmapLevel + "</size>");

            GUILayout.Label("<size=50>loadingMipmapLevel" + t1.loadingMipmapLevel + "</size>");

            GUILayout.Label("<size=50>minimumMipmapLevel" + t1.minimumMipmapLevel + "</size>");

            GUILayout.Label("<size=50>mipMapBias" + t1.mipMapBias + "</size>");

        }

    如下图所示,我们可以看到贴图已经被加载到第5级的mipmap了。此时你可能会有个疑问,如果摄像机拉远拉近是否会影响mipmap,答案是肯定的,只是摄像机拉到最近mipmap也只能5,但是摄像机如果拉远超过了5,那么就会自动适应6 、7级。

     

    这里有几个数值的含义我需要解释一下,

    calculatedMipmapLevel:表示当前摄像机与物体的距离计算出需要加载的mipmap等级。

    desiredMipmapLevel:表示当前实际加载的mipmap等级,因为我们可能强制设置了加载等级,那么实际加载的可能就和calculatedMipmapLevel不一致了。

    mipMapBias:表示加载加载mipmap等级的偏移量,比如原本加载的是0级的mipmap,由于mipMapBias设置了2,所以实际加载的就是2级,这个数值也可以设置成负数,比如原本需要加载2级mipmap,由于设置了-1,所以实际加载1级的mipmap,这样无疑就更浪费性能。

    下面我们在代码里动态修改mipmap的等级。

    1

    2

    3

    4

    5

    6

    7

    8

            if (GUILayout.Button("<size=80>调整mipmap等级 +</size>"))

            {

                t1.mipMapBias += 1f; //更模糊

            }

            if (GUILayout.Button("<size=80>调整mipmap等级 -</size>"))

            {

                t1.mipMapBias -= 1f; //更清楚

            }

    unity还提供了streaming controller组件, 需要绑定在摄像机上,其实就是对摄像机所看到的所有物体的mipmap做偏移和上面的用法类似。

     

    我们既然能修改单个物体的贴图的mipmap能否统一修改所有呢?比如现在打开了一个半屏界面,可以将背景中的3D物体的贴图mipmap全部降低。因为UI并不会开mipmap所以即使降低也不会受影响。

    1

    2

    3

    4

    5

    6

    7

    8

    9

            if (GUILayout.Button("<size=80>整体减低采样 -</size>"))

            {

                //0表示正常尺寸

                //1表示降低1/2

                //2表示降低1/4

                //3表示降低1/8

                //4表示降低1/16

                QualitySettings.masterTextureLimit = 4;

            }

    在切回0级mipmap

     

    展开全文
  • Unity中关于 Mipmap

    万次阅读 多人点赞 2019-06-09 15:21:04
    关于什么是Mipmap, 百科都有~ ...为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为 MIP map 或者 mipmap。这个技术在三维游戏中被非常广泛...

    关于什么是  Mipmap, 百科都有~   https://zh.wikipedia.org/zh-hans/Mipmap   

               在三维计算机图形的贴图渲染中有一个常用的技术被称为Mipmapping。为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为 MIP map 或者 mipmap。这个技术在三维游戏中被非常广泛的使用。  Mipmap 需要占用一定的内存空间,同时也遵循小波压缩规则(wavelet compression)

              Mipmap中每一个层级的小图都是主图的一个特定比例的缩小细节的复制品。虽然在某些必要的视角,主图仍然会被使用,来渲染完整的细节。但是当贴图被缩小或者只需要从远距离观看时,mipmap就会转换到适当的层级。事实上,在三线性过滤(trilinear filtering)起作用时,会在两个相近的层级之间切换。

              因为mipmap贴图需要被读取的像素远少于普通贴图,所以渲染的速度得到了提升。而且操作的时间减少了,因为mipmap的图片已经是做过抗锯齿处理的,从而减少了实时渲染的负担。放大和缩小也因为mipmap而变得更有效率。

               如果贴图的基本尺寸是256x256像素的话,它mipmap就会有8个层级。每个层级是上一层级的四分之一的大小,依次层级大小就是:128x128;64x64;32x32;16x16;8x8;4x4;2x2;1x1(一个像素)。例如在一个场景中,渲染贴图需要填满的空间大小是40x40像素的话,如果没有三线性过滤,那32x32 会被放大显示,或者有三线性过滤,会在64x64和32x32之间切换。最简单的生成贴图的方法就是依次做平均,当然也可以用更加高级的算法。

    1、 如何在Unity Inspector面板上查看Mipmap

    您可以使用勾选了“Generate Mip Maps”的Inspector 中的滑块和所选纹理来检查mipmap纹理。

    2、  如何在Scene视图中可视化mipmap级别

    f:id:baba_s:20190602173948p:plain

    可视化mipmap级别 

      • 高绘图密度
      • 纹理分辨率大于所需的
    • 蓝色
      • 低绘图密度
      • 可以增加纹理分辨率

     

    3、 尝试在Unity中可视化Mipmap的工作原理

    https://t-tutiya.hatenablog.com/entry/20180507/1525698407

    http://wiki.polycount.com/wiki/Mip_Mapping

    下载  http://wiki.polycount.com/wiki/File:Mip_colors_2014_chadwick.zip   导入Unity中 

    他这个纹理每一个level都是定制的

    创建一个新材质,将“mip_colors_1024_chadwick.dds”设置为Albedo纹理,并将材质指定给游戏对象,以便您可以看到mipmap的工作原理。      拉伸胶囊体, 这个视角观察, 红的1024×1024是原始图像,浅蓝色(512×512)→紫(256×256)。

     

    4、 可以显示mipmap的“Mipmap Visualization”简介(免费) 

    https://www.assetstore.unity3d.com/#!/content/40315?aid=1100l37E9

    F:ID:baba_s:20190602170257p:平纹

    将“MipmapVisualization”附加到场景对象

    F:ID:baba_s:20190602170150p:平纹

     

    5、 介绍“DebugGPU”,它可以在Game画面和Scene视图中显示mip地图级别

    https://github.com/slmao/DebugGPU                  对于Scene视图,直接使用Unity的mipmaps 模式就可以了, 但是想要在Game视图中也显示类似的效果。  

    F:ID:baba_s:20190602173434p:平纹

    F:ID:baba_s:20190602173539p:平纹

    将“DebugGPU”组件附加到场景的摄像机,并将“SceneViewShowMips” 设置为“Mipmap Shader”,将“SceneViewShowOverdraw”设置为“Overdraw Shader”

    您可以在游戏运行时按“Mipmap”按钮来使用它

     

    6、 “Unity-CustomMipMaps”简介,可以自定义mipmap纹理

    https://github.com/azixMcAze/Unity-CustomMipMaps

               可以看出命名规律吧。    test 原始图片 128×128,.mi1 是64×64   .mip2 是23×32    .mip3   是16×16

    在 test  资源右键   Reimport   

     

    7、

    其实刚刚的插件已经展示了,  怎么定制每个level的内容, 比如你可以,根据距离改变颜色了,  可以根据距离改变内容 

    F:ID:baba_s:20190602155608克:平纹

     F:ID:baba_s:20190602154738克:平纹

       

    using UnityEditor;
    using UnityEngine;
    
    public class Example : AssetPostprocessor
    {
        // 纹理添加到Unity项目中,
        // Unity项目的纹理更改时调用
        private void OnPostprocessTexture( Texture2D texture )
        {
            // 加载要设置为mipmap纹理的纹理
            var tex1 = AssetDatabase.LoadAssetAtPath<Texture2D>( "Assets/001.png" );
            var tex2 = AssetDatabase.LoadAssetAtPath<Texture2D>( "Assets/002.png" );
            var tex3 = AssetDatabase.LoadAssetAtPath<Texture2D>( "Assets/003.png" );
            
            // 设置mipmap纹理
            // 您可以在第二个参数中指定mipmap级别
            texture.SetPixels( tex1.GetPixels( 0 ), 1 );
            texture.SetPixels( tex2.GetPixels( 0 ), 2 );
            texture.SetPixels( tex3.GetPixels( 0 ), 3 );
    
            // 应用更改
            texture.Apply( false );
        }
    }

          Editor脚本,   也是需要在 主图片资源上右键   Reimport   。      

    在初始状态下,当纹理达到一定距离时,纹理会明显切换,但是
    通过打开“Fadeout Mip Maps”  纹理将在淡入淡出时切换

     

    8、  如何更改纹理mipmap偏差

    Mip贴图纹理偏差。   https://docs.unity3d.com/2018.3/Documentation/ScriptReference/Texture-mipMapBias.html  

    正偏差使纹理看起来更加模糊,而负偏差则使纹理更加锐利。请注意,使用较大的负偏压会降低性能,因此不建议使用超过-0.5的负偏压。在大多数情况下,通过使用各向异性过滤可以实现更好的纹理锐化。另请注意,mip贴图偏差不适用于MaterialPropertyBlocks,并且某些平台(例如,基于OpenGL ES)不支持自定义着色器。

     

    方式一: 

    using UnityEditor;
    using UnityEngine;
    
    public sealed class Example : AssetPostprocessor 
    {
        private void OnPostprocessTexture( Texture2D texture )
        {
            var importer = AssetImporter.GetAtPath( assetPath ) as TextureImporter;
            importer.mipMapBias = -10;
        }
    }

    使用AssetPostprocessor和TextureImporter

     

    方式二: 

    F:ID:baba_s:20190602212541p:平纹

    打开纹理的.meta文件并更改“mipBias”

     

    方式三:

    在Unity编辑器处于开发人员模式时,将Inspector的显示更改为Debug-Internal

    https://www.unity3dtips.com/unity-fix-blurry-textures-on-mipmap/     

    在远处查看对象时的模糊纹理是由mipmap引起的。但是,如果没有mipmap,对象可能会在视觉上更糟糕,并且对于渲染性能而言会更糟。
    本指南介绍如何控制Unity纹理mipmap的模糊性,而无需完全禁用mipmap。

    在纹理导入设置上启用时,mipmap是在远离相机渲染纹理时使用的较小版本的纹理。这使得距离中的纹理看起来更平滑,并且还可以提高渲染性能,从而为GPU渲染更小的纹理。

    启用了mipmap的Unity场景 此示例显示启用了mipmap的高分辨率纹理; 在远处,它们变得过于模糊,使得纹理看起来远离相机的低质量。

    禁用mipmaps的Unity场景 如果没有mipmap,相同的示例场景会变得非常混乱。抗锯齿将有助于现场,但由于抗锯齿的高性能成本,不应该依赖。

     

    调整mipmap以找到中间点

    Unity有一个隐藏的未曝光值,称为mipmap bias,它允许调整纹理导入设置,以便在过度模糊和严重混叠之间找到一个很好的中点。     但是,要修改此值,您需要使用编辑器脚本或将Unity置于开发人员模式以公开检查器内部调试模式。

    使用开发人员模式更改纹理导入mipmap偏差

    启用内部开发人员模式后,您可以从检查器访问内部调试模式。这些步骤显示了如何更改纹理导入器的mipmap偏差。

    1. 选择要调整mipmap设置的纹理。

      在项目窗口中选择纹理。

    2. 在检查器窗口中,从汉堡菜单中选择internal-debug。

      “汉堡包菜单”是检查员窗口右上角的3行。

    3. 查找并展开纹理设置可折叠部分。

       

    4. 调整mip偏差值。

      较高的值使纹理变得模糊,而较低的值使纹理更清晰。

      Unity建议不要使用低于-0.5的值,因为它会降低渲染性能。这似乎强烈基于使用情况,因此如果低于-0.5的值可以提供更好的结果,最好在低端设备上尝试不同的设置。

    5. 重新导入纹理以应用更改。

      必须重新导入纹理才能使用新的mip偏差值重新生成mipmap。

    展开全文
  • 今天给大家提供一个自动去掉图片mipmap勾选的小工具。对于UI贴图来说,我们不必应用mipmap,因为一般的UI都是“平铺”在正交摄像机视口的,和摄像机木有距离这一概念,所以我们大可以把UI贴图的mipmap选项去掉,以...
  • Unity学习-优化_MipMap

    2019-04-17 20:55:00
    上次看了下LOD,后来发现下面还有一篇介绍mipMap的文章,也跟着看了下 在概念上mipMap和LOD的优化出发点一样,都是基于摄像机距离物体的远近来优化的 不过MipMap上面没有LOD的3个层级设置了,而是在Texture里面...

     

      上次看了下LOD,后来发现下面还有一篇介绍mipMap的文章,也跟着看了下

      在概念上mipMap和LOD的优化出发点一样,都是基于摄像机距离物体的远近来优化的

    不过MipMap上面没有LOD的3个层级设置了,而是在Texture里面直接勾选即可

    简单的使用方式如下图

    勾选Fadeout Mip Maps就可以了

    Fade Range 是调整摄像机距离的显示效果的,可以跟进实际项目需求调整

    测试步骤

    1:同样新建一个带有texture贴图参数的材质球

    2:将设置好MipMap的texture赋值给材质球

    3:将材质球赋值给我们的测试物体

     

    为了看的更直观,我先取消MipMap功能

    =====================取消MipMap功能===============================

    近距离:

    远距离:

     

     除了看起来小一点,没什么区别

     

    ==========================勾选MipMap===================================

    (为了看的更直观,我将参数设置的比较大,稍微拉小一点就会有变化)

    近距离

     

     远距离

     

     

    很明显的图片纹理做了模糊处理,质感降低了,纹理也少了很多。从而降低显存的占用,提升渲染性能。

    不过每一种优化方式本身就会产生额外的开销,MipMap也是

    实用MipMap之后,texture的大小也会随之变大,和Lod同理,在使用了mipmap的同时Unity也会创建出低精度的texture,从而占用内存。

    还是那样,具体的利弊,各位看项目的实际情况使用啦~

     

    转载于:https://www.cnblogs.com/leixuan111/p/10726129.html

    展开全文
  • Unity Custom Mipmap

    2020-02-03 18:26:21
    基于Github上Unity Custom Mipmap 工程 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.IO; using System.Text.RegularExpressions; public ...

    基于Github上Unity Custom Mipmap 工程

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor;
    using System.IO;
    using System.Text.RegularExpressions;
    
    public class TestTextureIporter : AssetPostprocessor {
    	bool m_isReadable;
    	bool m_importing;
    
    	bool ShouldImportAsset(string path)
    	{
    		string pattern = GetMipmapFilenamePattern(path);
    		string mip1Path = string.Format(pattern, 1);
    		return File.Exists(mip1Path);
    	}
    	
    	string GetMipmapFilenamePattern(string path)
    	{
    		var filename = Path.GetFileName(path);
    		var filenameWithoutExtention = Path.GetFileNameWithoutExtension(path);
    		var extension = Path.GetExtension(path);
    		var directoryName = Path.GetDirectoryName(path);
    
    		return Path.Combine(directoryName, filenameWithoutExtention + ".mip{0}" + extension);
    	}
    
    	void OnPreprocessTexture()
    	{
    		string extension = Path.GetExtension(assetPath);
    		string filenameWithoutExtention = Path.GetFileNameWithoutExtension(assetPath);
    		var match = Regex.Match(filenameWithoutExtention, @".mip(\d)+$");
    
    		if(match.Success)
    		{
    			string filenameWithoutMip = filenameWithoutExtention.Substring(0, match.Index);
    			string directoryName = Path.GetDirectoryName(assetPath);
    			string mip0Path = Path.Combine(directoryName, filenameWithoutMip + extension);
    
    			TextureImporter importer = (TextureImporter)TextureImporter.GetAtPath(mip0Path);
    			if(importer != null)
    				importer.SaveAndReimport();
    		}
    
    		if (ShouldImportAsset(assetPath))
    		{
    			m_importing = true;
    
    			string pattern = GetMipmapFilenamePattern(assetPath);
    			int m = 1;
    
    			bool reimport = false;
    
    			while(true)
    			{
    				string mipPath = string.Format(pattern, m);
    				m++;
    
    				TextureImporter importer = (TextureImporter)TextureImporter.GetAtPath(mipPath);
    				if(importer != null)
    				{
    
    					if(!importer.mipmapEnabled || !importer.isReadable)
    					{
    						importer.mipmapEnabled = true;
    						importer.isReadable = true;
    						importer.SaveAndReimport();
    
    						reimport = true;
    					}
    					continue;
    				}
    				else
    				{
    					break;
    				}
    			}
    
    			if(reimport)
    			{
    				m_importing = false;
    				return;
    			}
    			TextureImporter textureImporter  = (TextureImporter)assetImporter;
    			m_isReadable = textureImporter.isReadable;
    			textureImporter.isReadable = true;
    		}
    	}
    
    	void OnPostprocessTexture(Texture2D texture)
    	{
    		if (m_importing)
    		{
    			string pattern = GetMipmapFilenamePattern(assetPath);
    
    			for (int m = 0; m < texture.mipmapCount; m++)
    			{
    				var mipmapTexture = AssetDatabase.LoadAssetAtPath<Texture2D>(string.Format(pattern, m));
    
    				if(mipmapTexture != null)
    				{
    					Color[] c = mipmapTexture.GetPixels(0);
    					texture.SetPixels(c, m);
    				}
    			}
    			
    			texture.Apply(false, !m_isReadable);
    			TextureImporter textureImporter  = (TextureImporter)assetImporter;
    			textureImporter.isReadable = m_isReadable;
    		}
    	}
    }
    

    Mipmap

    mipmap是为了处理在不同距离情况下,节约gpu计算资源的一种方法。在真实世界中,较远的物体反射到人眼睛中的光线占比越少,所需要的细节越少。因此在游戏中,我们不仅仅需要将远处的模型进行lod简化处理,还需要对贴图进行简化。这种处理方式就是mipmap
    mipmap是预处理阶段处理,因此只计算一次,但是同时会占用一定的内存。是用空间换时间的一种方法。
    如下图,
    在这里插入图片描述
    处理效果

    Custom Mipmap

    上图中是mipmap自定义的效果。由近到远为0,1,2,3。

    核心代码如下

    void OnPostprocessTexture(Texture2D texture)
    	{
            // 设置mipmap
    		if (m_importing)
    		{
    			string pattern = GetMipmapFilenamePattern(assetPath);
    
    			for (int m = 0; m < texture.mipmapCount; m++)
    			{
    				var mipmapTexture = AssetDatabase.LoadAssetAtPath<Texture2D>(string.Format(pattern, m));
    
    				if(mipmapTexture != null)
    				{
    					Color[] c = mipmapTexture.GetPixels(0);
                        // 通过setpixel来设置mipmap
    					texture.SetPixels(c, m);
    				}
    			}
    			
    			texture.Apply(false, !m_isReadable);
    			TextureImporter textureImporter  = (TextureImporter)assetImporter;
    			textureImporter.isReadable = m_isReadable;
    		}
    	}
    

    在unity的回调函数OnPostprocessTexture中,通过setpixel来设置了贴图所对应的mipmap像素。由此设置完毕。

    在窗口中,右上角为mipmap调节窗口,可以通过调整查看。

    展开全文
  • unity 显示mipmaplevel

    2019-09-28 22:34:10
    显示mipmaplevel 需要贴图可读写不压缩 using UnityEngine; using System.Collections;public class ExampleClass : MonoBehaviour { void...
  • 在游戏开发的后期, 最头疼的时候莫过于优化游戏性能, 这其中对于加载资源时消耗的优化,用的最多的莫过于MipMap以及LOD。今天我们就来详细介绍下MipMap 原理 MipMap(mipmapping)多级渐远纹理技术,又被称为...
  • unitymipmap

    2019-05-15 15:17:38
    Mipmap技术有点类似于LOD技术,但是不同的是,LOD针对的是模型资源,而Mipmap针对的纹理贴图资源 使用Mipmap后,贴图会根据摄像机距离的远近,选择使用不同精度的贴图。 缺点:会占用内存,因为mipmap会根据摄像机...
  • unity mipmap

    2019-09-28 22:33:32
    unity 开miapmap会糊很多 尤其在editor里面 我估计和editor的 tempRT resolution 957x380有关 -----确实是这样 手机上糊的程度低很多 中间rt我用的1920x1080 http://www.ceeger.com/forum/read.php?tid=13151 ...
  • Unity中的MipMap与LOD

    2020-02-19 16:43:28
        mipmap针对的是纹理贴图,大白话就是,一个模型身上会有贴图,当我们对这个贴图使用了MipMap技术之后,那么在游戏运行中这个模型的贴图会根据摄像机距离模型的远近而调整不同的不同质量的贴图显示。...
  • public class TestEditor : MonoBehaviour { ... [MenuItem("LTEditor/图片去除mipmap")] static void TestMenu() { List<string> filePaths = new List<string>(); if (Selection.
  • Unity 3D - MipMap

    千次阅读 2016-07-20 09:17:43
    Unity 3D - MipMap : 类似LOD的渲染优化技术 . 作用 : 优化渲染 , 提高游戏流畅度 , 根据摄像机距离模型的远近而调整不同的不同质量的贴图显示 . 优点 : 减少渲染消耗 , 提高帧数. 缺点 : 占用内存...
  • 今天给大家提供一个自动去掉图片mipmap勾选的小工具的制作方法。 大家对Lod应该都有所了解,其原理是根据摄像机和模型之间不同距离(准确地讲,应该是模型所占摄像机视口的比例,距离越远比例越小,反之越大)而...
  • Unity优化技术--UI优化之Mipmap

    千次阅读 2018-06-01 10:31:21
    Mipmap技术有点类似于LOD技术,但是不同的是,LOD针对的是模型资源,而Mipmap针对的纹理贴图资源 使用Mipmap后,贴图会根据摄像机距离的远近,选择使用不同精度的贴图。 缺点:会占用内存,因为mipmap会根据摄像机...
  • GPU发热的元凶之一“带宽” 所以通常我们都会打开mipmap,如下图所示,在unity中可以拖动右上角的条来查看贴图每个等级的mipmap贴图。那么它的等级一共分成0级-9级, 0级表示最清楚,9级表示最模糊。 贴图分辨率是...
  • 首先,没弄懂 这个东西是否带来了性能上的提升... 通常Unity会加载存储在磁盘上的所有mipmap级别,但是使用此系统,您可以直接控制加载哪些mipmap级别。 通常,这样的系统通过仅加载渲染场景中当前相机位置所需的...
  • mipmap of unity

    2019-09-28 22:33:05
    mipmap generation 0级不压缩 1级 4个合1个 在unity里面 明显开了 mipmapgenerate之后 level0变糊了 ================ 我查了资料 回忆了之前的项目,也找朋友确认过 level0就是不压缩的 应该是original 那么...
  • Unity中的Miamap

    2020-01-08 19:26:30
    这里有一篇大佬介绍mipmap以及unity中一些mipmap使用技巧的博文Unity中关于 Mipmap但是介绍不够详细, 关于unity中内置的一些mipmap面板上的功能并没有介绍,虽然这些可以通过看unity官方文档学习,但是我在这还是要...
  • Unity之MipMaps

    2021-09-07 10:01:02
    Unity之MipMaps Mipmap技术有点类似于LOD技术,但是不同的是,LOD针对的是模型资源,而Mipmap针对的纹理贴图资源,使用Mipmap后,贴图会根据摄像机距离的远近,选择使用不同精度的贴图。 缺点: 会占用内存,因为...
  • 光源类型有point Light,spot Light,direction Light,area Light,但是经常会看到一种光叫 indirection Light (间接光),在我理解看到,间接光其实就是光遇到物体后能发生反射效果,在unity中的光默认都不为间接光。...
  • 图片尺寸及mipmap使用的检查 详细功能: 在Assets文件夹下查找出所有的...1. 在Unity中,所支持的图片后缀大体有4种(.BMP|.JPG|.GIF|.PNG),以这4种后缀为准。 2. 在Assets文件夹下寻找所有带有这4中后缀的资...
  • Texture Streaming Mipmap使用疑问

    千次阅读 2019-07-02 09:42:33
    这是第165篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,...Texture Streaming Mipmap使用疑问 UE4材质里如何获取到平行光方向 带Submesh的SkinnedMeshRend...
  • unity内嵌网页BrowserUI

    2018-12-06 17:19:43
    - Mipmap仿真着色器:更快的纹理更新,无闪烁 - 拦截新窗口并为其创建场景对象 - 极简主义JSON库 - <视频>支持Chromium的开放编解码器(h.264 / mp3未获得许可) - 渲染SVG - 自定义游标 - Adob​​e Flash的实验...
  • Unity Android Icons 配置

    千次阅读 2019-09-24 15:06:19
    引言 由于 Google 规定新上线的 App 的 TargetVersion 必须不低于28 ,而对于 API ...因此,Unity 中的图标设置栏也发生了一些变化,在 Unity 的 Android 平台 PlayerSettings 中,Icon 设置由原来的一栏变为三栏...
  • mipmap的设置及使用

    千次阅读 2019-12-29 21:11:58
    1、mipmap是什么? MipMap是一种电脑图形图像技术,用于在三维图像的二维代替物中达到立体感效应 2、mipmap的意义? 意义:Mipmap针对的纹理贴图资源,使用Mipmap后,贴图会根据摄像机距离的远近,选择使用不同...
  • shader-纹理处理-mipmap

    2020-03-31 14:25:20
    unity中大概多占33%的内存)。每一个层级的小图都是主图按一定比列缩小细节的复制图。当图片被缩小或远离摄像机时,会切换早适合的mipmap层级。mipmap图片是经过缩小后的图片,读取的像素值远小于原图片,同时已.....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,011
精华内容 804
关键字:

mipmapunity