Unity3D:Mipmap 介绍
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
Mipmap 介绍
mip 或 mip 级别是具有特定分辨率的纹理版本。Mips 存在于称为 mipmap 的集合中。Mipmap 包含单个纹理的逐渐缩小和较低分辨率的版本。
例如,mipmap 可能包含纹理的四个版本,从原始纹理 (Mip 0) 到 Mip 1、Mip 2 和 Mip 3:

Mipmap 通常用于渲染 3D 场景中的对象,其中纹理对象与摄像机的距离可能不同。较高的 mip 级别用于靠近摄像机的对象,较低的 mip 级别用于较远的对象。
Mipmap 可以加快渲染操作,并在 GPU 以低于其全分辨率渲染纹理的情况下减少渲染伪影。mip 实际上是原始纹理的缓存、缩减采样版本。GPU 无需对原始的全分辨率纹理执行许多采样操作,而是可以对已缩减采样的版本执行较少数量的操作。
有时,mipmap 是没有好处的。Mipmap 将磁盘和内存中的纹理大小增加了 33%。当纹理仅以其全分辨率呈现时,它们也不会提供任何好处,例如未缩放的 UI 纹理。
您可以手动为纹理创建 mipmap,也可以指示 Unity 为您生成 mipmap。要自动生成 mipmap,请确保原始纹理的分辨率是 2 的幂值,如示例 mipmap 图像所示。
您可以在纹理导入设置检查器中为纹理资源启用或停用 mipmap。
GPU 如何对 mip 级别进行采样
当 GPU 对纹理进行采样时,它会根据当前像素的纹理坐标 (UV) 以及 GPU 计算的两个内部值(DDX 和 DDY)确定要使用的 mip 级别。DDX 和 DDY 提供有关当前像素旁边和上方像素的 UV 的信息,包括距离和角度。
GPU 使用这些值来确定相机可以看到多少纹理细节。当前像素与其邻居之间的距离越远,角度越大,意味着GPU选择分辨率较低的mip;更短的距离和不那么极端的角度意味着 GPU 选择具有更高分辨率的 MIP。
GPU 还可以将来自两个 mips 的纹理信息混合在一起并进行三线性过滤。在采样时混合 mip 可以使从一个 mip 到另一个 mip 的过渡不那么明显。为了混合 mips,GPU 从一个 mip 中获取特定百分比的纹理信息,其余部分从另一个 mip 中获取。
Mip 偏置
根据采样器设置,称为 mip 偏差的设置可以在采样时执行两项操作:
- mip 偏差可以更改 GPU 为样本选择较低或较高 mip 的阈值。当您在采样器中使用点和线性滤波时,GPU 会选择特定的 mip。例如,GPU 可能会决定一组 UV 的纹理使用 Mip 3 中的样本。当 mip 偏差为 –2 时,GPU 将改用更高分辨率的 Mip 1 作为样本。
- 在混合来自不同 mip 的样本时,mip 偏差可以告诉 GPU 以确切的百分比偏爱一个 mip 而不是另一个。当您在采样器中使用三线性滤波时,GPU 会混合 mips。例如,GPU 的计算可能返回值 0.5。0.5 值告诉 GPU 从一个 mip 中获取所需的 50% 的纹理信息,从 mipmap 中的下一个 mip 中获取剩余的 50%。增加 0.2 的 mip 偏差后,0.5 值将变为 0.7,GPU 将从第一个 mip 中获取 70% 的纹理信息,从第二个 mip 中获取仅 30% 的纹理信息。
GPU 具有全局 mip 偏差,默认情况下会应用于其 mip 选择。纹理可以有自己的 mip 偏差,Unity 会从全局 mip 偏差中添加或减去这些偏差。您还可以为着色器中的单个纹理采样操作指定自己的 mip 偏差。
要为单个纹理设置 mip 偏差,请参阅 Texture.mipMapBias。若要在手动编码着色器中为纹理采样操作设置 mip 偏差,请使用 HLSL 函数,例如 tex2dbias。要在着色器图中为纹理采样操作设置 mip 偏差,请参阅采样纹理 2D 数组节点或采样纹理 2D 节点。
Unity 如何加载 mipmap
您可以使用 Mipmap 流式处理控制 Unity 在运行时加载 mipmap 的方式。
由3D建模学习工作室整理翻译,转载请注明出处!