【Unity】Mipmaps(多级渐进纹理)
本文最后更新于 2024年10月10日 晚上
【Unity】Mipmaps(多级渐进纹理)
https://docs.unity.cn/cn/2022.3/Manual/texture-mipmaps.html
Mipmaps 是 GPU 支持的一项可选的纹理功能,这会导致额外生成一组基于原纹理但分辨率逐渐降低的小纹理,级别越高分辨率越低,之后 GPU 采样纹理时将通过一套规则选择其中最合适的纹理来进行采样。
Mipmaps 的优缺点
-
加快 GPU 渲染速度:
因为越低 mip 级别的纹理分辨率也越低,所以 GPU 采样执行的操作也越少。
-
避免锯齿和摩尔纹出现:
自动降分辨率,可以解决当物体在屏幕的像素大小远小于纹理大小时的过采样导致的渲染显示异常。
-
占用额外的磁盘内存大小:
额外生成的低级别贴图也会像正常贴图一样占用磁盘和内存,约增加 33%的大小。
所以仅当使用纹理的对象与相机有远近变化时才该使用,对于不会缩放移动的 UI 来说,使用 mipmaps 只有单纯的负面影响。
GPU 如何对 mip 级别采样
Mipmaps 主要用在 3D 渲染中,根据现象来看,通常根据纹理对象与相机的距离,越近 GPU 越会选择 mip 级别较高的纹理,越远则选择 mip 级别越低的纹理。
更具体的过程是,当 GPU 对纹理采样时,GPU 会检查当前像素与旁边和上边像素的 uv 距离差异(通过对 uv 执行 DDX 和 DDY 函数得出)。距离越大说明物体越远,所以使用低分辨率 mip;距离越小说明物体越近,所以用高分辨率 mip。
如果为纹理启用了三线性过滤模式,GPU 对 mip 采样时还会考虑同时采样和混合相邻的 mip,从而使 mip 间过渡变得更加平滑(就像把 mip 索引从 int 变成了 float 类型)。
mip bias(Mip 偏差)
采样器支持名为 mip bias 的设置,这可以使 GPU 选取 mip 时计算出的参照数发生偏移,从而采样比原本更高或更低级别的 mip。
- 当未启用三线性过滤时,mipbias 为整数类型,可直接影响选取的 mip 的索引。
- 当启用三线性过滤时,mipbias 为小数类型,可更精细化的使采样偏向于一边的 mip,而不只是调整采样的 mip 范围。
Mipmap 流系统
https://docs.unity.cn/cn/2022.3/Manual/TextureStreaming.html
Mipmap 流系统是 Unity 上传 Mipmap 的一种方式。
默认情况下 Unity 会加载纹理的所有的 mipmaps,但并不是每个都能用上,因此存在浪费内存的性能问题。而该系统可以强迫 Unity 只加载当前摄像机渲染所要用到的 mipmaps,只需少量的 CPU 资源为代价就可能大幅减少 GPU 内存占用。