Mipmap 级别是具有特定分辨率的纹理版本。Mipmap 级别存在于称为 Mipmap 的集合中。Mipmap 包含单个纹理逐步缩小和降低的分辨率版本。
例如,Mipmap 可能包含纹理的四个版本,从原始纹理(Mipmap 级别 0)到 Mipmap 级别 1、Mipmap 级别 2 和 Mipmap 级别 3:
Mipmap 通常用于渲染 3D 场景中的对象,其中纹理对象与摄像机的距离可能各有不同。较高的 Mipmap 级别用于离摄像机较近的对象,而较低的 Mipmap 级别用于较远的对象。
在 GPU 以低于全分辨率渲染纹理的情况下,Mipmap 能够加快渲染操作并减少渲染瑕疵。Mipmap 实际上是原始纹理的缓存下采样版本。GPU 可以对已下采样的版本执行更少的操作,而无需对原始全分辨率纹理执行许多采样操作。
有时,Mipmap 并无益处。Mipmap 可使纹理在磁盘和内存中的大小增加 33%。当纹理只以全分辨率渲染时,例如未缩放的用户界面 (UI) 纹理,它们也不会带来任何益处。
您可以手动为纹理创建 Mipmap,也可以指示 Unity 为您生成 Mipmap。要自动生成 Mipmap,请确保原始纹理的分辨率是 2 的幂,如示例 Mipmap 图像所示。
您可以在纹理导入设置检视面板 (Texture Import Settings Inspector) 中为纹理资源启用或禁用 Mipmap。
当 GPU 对纹理进行采样时,它会根据当前像素的纹理坐标 (UV) 以及 GPU 计算的两个内部值来确定要使用的 Mipmap 级别:DDX 和 DDY。DDX 和 DDY 提供有关当前像素旁边和上方像素的 UV 的信息,包括距离和角度。
GPU 使用这些值来确定纹理的细节对摄像机可见的程度。当前像素与其邻近像素之间的距离越远、角度越大,意味着 GPU 选择的 Mipmap 级别分辨率越低;距离越短、角度越小,意味着 GPU 选择的 Mipmap 级别分辨率越高。
GPU 还能通过三线性过滤将两个 Mipmap 级别的纹理信息混合在一起。在采样时混合 Mipmap 级别可以使从一个 Mipmap 级别到另一个 Mipmap 级别的过渡不那么明显。要混合 Mipmap 级别,GPU 会从一个 Mipmap 级别获取特定百分比的纹理信息,其余的则从另一个 Mipmap 级别获取。
根据采样器的设置,名为“Mipmap 偏差”的设置可以在采样时执行两件事:
GPU 具有全局 Mipmap 偏差,默认应用于其 Mipmap 级别选择。纹理可以有自己的 Mipmap 偏差,Unity 会从全局 Mipmap 偏差中添加或减去此偏差。您还可以为着色器中的单个纹理采样操作指定自己的 Mipmap 偏差。
要设置单个纹理的 Mipmap 偏差,请参阅 Texture.mipMapBias。要在手动编码着色器中为纹理采样操作设置 Mipmap 偏差,请使用 HLSL 函数,例如 tex2dbias。要在着色器图 (Shader Graph) 中为纹理采样操作设置 Mipmap 偏差,请参阅采样纹理 2D 数组节点或采样纹理 2D 节点。
可以使用Mipmap 串流来控制 Unity 在运行时加载 Mipmap 的方式。