提到mipmap,大多数人的第一反应是“更小的纹理副本”。这个说法没错,但它解释不了一个现象:为什么关闭mipmap的截图看起来依然清晰,画面一动起来却闪烁、爬动、噪点频出?为什么远处的植被会消失,法线贴图的高光会闪?为什么图集(atlas)只在低层级出现渗色?
把mip链看作三样东西,比“小副本”这个模型有用得多:
- 时间稳定性工具——让画面在运动时保持稳定,不闪不跳;
- 带宽与显存分配机制——决定哪些数据驻留GPU,哪些按需加载;
- 层级语义结构——不同层级可以保留不同类型的信息。
本文基于Unity 6.5(6000.5)的术语。Unity 2022/2023 LTS、其他Unity 6版本以及URP/HDRP包版本中,Inspector中的名称可能有所不同。
mipmap匹配的是采样密度,不是距离
想象一块4096×4096的纹理铺在地面上,以很小的角度观察。一个屏幕像素可能覆盖数百个纹素(texel)。如果只采样mip 0,等于从这数百个纹素里挑了一个极小的子集——摄像机稍微一动,挑中的子集就变了,于是出现爬动细节、摩尔纹和闪烁。
mipmap的作用是把采样密度拉近到屏幕投影的实际覆盖范围。距离确实有影响,但它不是唯一规则。投影尺寸、UV缩放、表面角度、纹理分辨率、投影方式、偏移(bias)和各向异性(anisotropy)都会影响最终结果。
对于普通的隐式采样,GPU会估算相邻片元(fragment)间的UV变化。简化公式如下:
rho = max(length(ddx(texelPosition)), length(ddy(texelPosition)))
lod = log2(rho)
LOD接近0指向mip 0,接近1指向mip 1。硬件实现比这复杂得多,尤其是加入各向异性过滤后,但核心模型不变:屏幕空间的UV导数驱动mip选择。
双线性、三线性、各向异性,各管各的事
三种过滤方式解决的问题不同:
- 双线性(Bilinear):在单个mip内部混合纹素;
- 三线性(Trilinear):混合两个相邻mip;
- 各向异性(Anisotropic):处理斜面上的拉长足迹。
三线性过滤不能替代各向异性过滤。一条路面即使mip过渡已经很平滑,可能仍然需要各向异性采样。
理想LOD与驻留质量是两回事
采样器可能想要mip 0,但流式加载(Streaming)当前只驻留了mip 2及更粗糙的层级。这就是为什么摄像机切换后表面会先模糊、后变清晰。务必把“理想采样LOD”和“GPU内存中实际可用的最高分辨率mip”分开看待。
33%的额外开销,背后是更有用的账
对于方形纹理,完整mip链大致是:
Mip 0: 4096×4096
Mip 1: 2048×2048
Mip 2: 1024×1024
……
Mip 12: 1×1
每一级纹素数量是上一级的四分之一:
1 + 1/4 + 1/16 + 1/64 + ... = 4/3
所以完整mip链比单独mip 0多出约33%的纹素。但反过来看,对预算规划更有用:
单独mip 0约占整条链的四分之三。把最大分辨率降一级,纹素总量不是减半,而是把剩余链缩减到约四分之一;降两级则缩减到约十六分之一。
压缩块大小、最小mip存储、对齐要求以及平台细节都会改变精确的字节数,但上述比例关系是预算规划的基础。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.