学习进度
0/9 已勾只保存在这台浏览器;勾满 9 项即视为本题完成。
先把题目说成人话
相机靠近地砖时,每条细缝都看得清;走远以后,许多细缝会挤进同一个屏幕小格。若机器仍从原始大图里随便挑少数颜色,镜头一动,刚好被挑中的细缝就会不断变化,于是远处地面闪烁、爬动,甚至出现彩色波纹。现实要解决的不是“把远处磨糊”,而是先把已经挤不下的细节妥善合并。
贴图上的一个小格叫纹素(texel)。预先为同一张图准备一组逐级缩小的版本,叫多级渐远纹理(Mipmap);机器根据一个屏幕像素在贴图上盖住多大范围,选择合适层级(LOD)。斜着看地面时,这个覆盖范围会从方块拉成长条,还要再用各向异性过滤(Anisotropic Filtering)照顾两个方向的尺度差。
这是虚构教学故事,不是个人项目经历。
场景:先让问题变得看得见
移动端场景里,同一张 2048×2048 地表纹理近处正常,远处随相机移动不断闪。团队固定设备、分辨率、相机路线和纹理导入设置,保存开关 Mip 的画面对比作为基线。
(右脑)画面:想象屏幕上的一个小格在地面留下脚印。相机很近时,脚印只盖住几粒细沙,每一粒都能单独看见;相机走远后,同一个脚印会摊住一大片细沙,若仍只随手捡其中几粒,镜头轻轻移动就会换成另一批,于是画面不停跳。解决办法是提前把整片地面拍成一叠逐渐缩小的照片,脚印越大,就拿越小、越能代表整片平均样子的照片。斜着看时脚印会拉成长条,还要沿长短两个方向分别照顾,不能只换一张更小的方形照片。
(左脑)对表:本题对象是纹理、屏幕像素在 UV 空间的 footprint、GPU 选出的 LOD、过滤方式和实际内存驻留。远处闪烁是观察事实,“需要更锐”只是小明的假设;层级染色、固定路线录像和各向异性对照才是证据。UV 与 LOD 无长度单位,屏幕尺寸以像素计,存储以字节计;完整二维 Mip 链多约三分之一只在各级面积按四分之一递减、格式与对齐一致的前提下成立。小照片类比能形成尺度直觉,但不等于证明某张 UI、图集或数据纹理一定该开或关 Mip。
小明:先形成一个完整猜测
小明以为“远处不够清晰”,把 Mip Bias 调成负值。地面静止时看起来更锐,但运动时闪烁更重。这条失败结果说明:问题不是细节不够,而是屏幕像素已经装不下那些高频细节。
小红:把猜测放回现实检查
小红固定相机路径与纹理,只让采样策略依次变化:先用 Mip 层级染色确认远处确实选到较低层;再分别测试无 Mip、正常 Mip 和不同各向异性等级。正常 Mip 消除了大部分闪烁;斜视地面仍发糊时,提高各向异性才有帮助,因为斜视像素的纹理覆盖范围是一条长条,而不是近似正方形。
她也把存储账算清楚:各层面积相对原图是 1 + 1/4 + 1/16 + … = 4/3,因此完整 Mip 链理论上比只有 0 级多约 33%。压缩格式、对齐和极小层级会让实际文件数略有偏差。
我:用检查结果修正模型
我按用途分类:世界地表、角色和会缩小的 3D 纹理保留 Mip;斜视明显的地表按目标设备选择有限的各向异性;按屏幕像素一比一显示且不会缩放的 UI 图标可以关闭 Mip。图集不能因为“是图集”就一概关闭——它进入远景时仍需要 Mip,生成链要从 0 级到实际保留的最低分辨率层逐级膨胀每个岛的 gutter,并逐层检查过滤 footprint 不会采到相邻岛;若布局无法保证,就限制最低 Mip,或改用 Texture2DArray/独立纹理。平铺地表同样会随距离缩小,更不能归进“永远不用 Mip”。法线、通道遮罩和 Alpha Test 叶片也不能照搬普通颜色图的缩小规则:它们可能需要法线重归一化、通道语义过滤或覆盖率保持,再由对应材质回归证明。
移动端的正确问题不是“必须关哪些材质”,而是每张纹理是否会发生 minification、额外 33% 是否值得、纹理流送策略是否能覆盖峰值。最终应在目标设备的固定路线中同时记录画面、Unity 报告的纹理内存/已加载 mip,以及平台工具看到的物理驻留与采样压力。
(右脑)画面修正:再看远处那块地面,小明把照片换得更清楚,静止时细沙更锐,镜头一动却跳得更厉害。小红改用能代表一整片细沙的缩小照片,跳动明显安静下来;斜着看地面时,脚印被拉成长条,她又让取样顺着长条多照顾一些。一个办法照顾脚印有多大,另一个办法照顾脚印朝哪个方向拉长,它们解决的不是同一件事。
(左脑)严格对表:逐纹理执行:确认它在运行时是否会缩小或斜视采样 → 若会,按颜色、法线、遮罩或透明覆盖语义生成 Mip,并用导数驱动的 LOD 验证层级选择 → 斜视质量不足时在目标设备上增加有限各向异性 → 图集按实际保留的最低 Mip 逐级膨胀 gutter,并在每一级验证过滤 footprint 不跨岛;无法保证时限制最低层,或改用 Texture2DArray/独立纹理 → 同时记录画面稳定性、加载层级、内存字节和带宽。只有在采样始终接近一像素对一纹素、Shader 不会取低级 LOD、且关闭后的闪烁与缓存成本通过回归时,才验收无 Mip;“移动端材质必须关闭 Mip”不是成立的通则。
老师解惑
- 纹理 footprint:一个屏幕像素在纹理空间覆盖的区域;它越大,应该选择越低分辨率的 Mip。
- 层级选择:GPU 通常由纹理坐标导数估算 LOD,再在相邻层间过滤。
- 各向异性过滤:处理斜视时细长的 footprint;它补充 Mip,不替代 Mip。
- 约 33%:是完整二维 Mip 链的几何级数结果,不是所有平台上精确相同的包体增量。
- 适合关闭的情况:固定尺寸、不缩放的 UI、部分查找表或有自定义采样规则的数据纹理;仍要确认 Shader 不会采低级 Mip。
工具分工
- Unity Texture Importer:检查 Mip、过滤、各向异性、压缩和平台覆盖设置。
- Mip 层级可视化:确认不同距离和斜角实际选了哪一层。
- Unity Memory Profiler / Frame Debugger:前者核对 Unity 报告的纹理内存与已加载资源,后者确认资源与 Pass;物理 GPU 驻留和带宽仍要结合 Texture Streaming 统计与目标平台工具。
- 目标设备画面录制:沿固定路线观察闪烁、串色和清晰度,而不是只看静止截图。
记忆钩子
会缩小的纹理通常需要 Mip;只有确定永远不缩小时,才考虑关闭它来省约 33% 存储。
这是教学场景,不是目标项目的真实捕获或个人经历。
下一步:验证这条因果
把 mip、过滤和各向异性逐项对上质量与采样数。
教学边界:它只验证这一条画面因果,不替代完整答案、项目经历或目标设备数据。