


一、带宽的瓶颈:
1. 使用了尺寸很大且未压缩的纹理。
2. 分辨率过高的帧缓存(framebuffer)。
二、节约带宽的途径:减少纹理大小,利用分辨率缩放
三、什么是MipMap?
简单说就是使用MipMap后,贴图根据摄像机距离的远近,选择使用不同精度的贴图。当摄像机距离贴图较近时,使用自身图片尺寸的最大分辨率,当贴图离摄像机非常远,远到像小蚂蚁那样,使用的图片就是根据自身分辨率等比缩放的低精度贴图。
MipMapping(多级渐远纹理技术)是三维计算机图形的贴图渲染中常用的技术。使用这个技术生成的纹理图一般称为mipmaps(多级渐远纹理)。
四、使用和不使用的MipMap的区别是什么?
当使用MipMap后,贴图会根据当前贴图分辨率,以四分之一梯度向下递减,这时这张贴图储存的数据就不再是原尺寸一张贴图,而是八张在不同精度的贴图。这意味着在使用MipMap后图片资源所占的内存空间会加大。

这是一张贴图在没有勾选和勾选后的内存变化,可以看出使用了MipMap的贴图大致是没使用的1.3倍。

在美术制作场景地面时,贴图使用MipMap时会出现这样的问题,可以看到当场景地面随着视距变远时,使用了不同精度的贴图,这时连续的地面出现了比较明显的分割线。

如果不使用MipMap的话,虽然我们控制了内存大小,甚至提升了美术表现,让所有情况下都使用较清晰的纹理。随之而来带来的问题就是,所有表现都使用高精度贴图计算,占用较多的带宽,当带宽到达瓶颈时,会延误采样,进而延误GPU,导制渲染效率下降。
五、如何选择使用MipMap?
既然我们了解了其技术原理是通过纹理与摄像机距离的远近来判断使用不同精度的贴图,那我们就可以决定如何使用MipMap。
比如UI,UI特效和2D游戏中纹理就可以不使用MipMap来减少包体大小,因为大多数情况下,他们和摄像机的距离是固定的,并且也需要他们使用较高精度的表现。
比如3D场景中的场景物体,一个油桶或者一块石头,或者场景特效,部分小怪的特效贴图,都是可以使用MipMap的。他们可能存在和摄像机近的情况,也存在距离摄像机远的情况,并且可以认为他们是游戏中的次要表现时,我们可以通过MipMap来提升渲染效率。反之,重要boss等主要表现可以考虑通过不使用来稳定其美术效果,主角大多数相对摄像机位置都差不多,不勾选的话也可以减少内存。
六、如何在Scene视图中可视化mipmap级别?
在Scene视图中,我们可以把Shaded标签选择成Mipmaps。

可视化MipMap级别:
红色:高绘图密度,纹理分辨率大于所需的分辨率
蓝色:低绘图密度,可以增加纹理的分辨率
我们可以通过这个图来理解一下,往往其他游戏开发者所说的特效很费到底是怎么个费法。我在这个练习中,使用了128*128的圆点来模拟雪花特效,使用512*512的贴图作为雪地的纹理,这时我打开MipMap时发现,原来雪花用128*128是多么的浪费,几乎所有的雪花的都处于贴图精度大于实际表现范围,都是红色的。

经过一番尝试之后,我发现当这个圆点贴图压缩到32*32尺寸时,距离摄像机最近的一些雪花已经变成了黄色和黑色,这就说明在他们最大的情况下也保证了没有超出贴图本身的分辨率。并且在这个过程中美术表现是没什么损失的,因为以前都是精度大于显示尺寸是浪费的。这时再回头看了一下这张圆点图从10.8K,减到了1.4K,然后表现还没什么变化。这确实让我以前的特效经验产生了较严重的自我否定。

七、如何更改纹理mipmap偏差
方式1:

方式2:

方式3:

八、其他的相关拓展
1.可视化Mipmap工作原理





2.DebugGPU让Game画面和Scene视图中显示mip底图级别


3. Unity-CustomMipMaps 自定义mipmap纹理
https://github.com/azixMcAze/Unity-CustomMipMaps





九、参考文献
Unity中MipMap的参数设置和效果
Unity Shader入门精要
Unity之MipMap
Unity中关于Mipmap