1.Mipmap简介
2.Unity中Mipmap参数
1.Mipmap简介
csharp
复制代码
1).什么是Mipmap
Mipmap可以理解为同一纹理的"分辨率套餐"
a.导入一张2048 * 2048的纹理, 启用Mipmap后, Unity会自动生成一系列分辨率逐级减半的纹理版本(1024 * 1024, 512 *
512....直到1 * 1)
b.这些不同分辨率的纹理层级被打包在一起, 形成一个Mipmap链
核心逻辑: 当3D物体离相机很远时, Unity会自动选择"低分辨率的Mipmap层级来渲染, 而不是强行缩放原始高分辨率纹理"
csharp
复制代码
2).为什么用Mipmap
a.解决视觉问题
没有Mipmap时, 远处的纹理会因为"过度采样"出现锯齿, 闪烁, 尤其是移动的物体; 启用Mipmap后, 渲染效果会更平滑
b.提升性能
当物体很远时, GPU会自动选择低分辨率的Mipmap层级, 此时只需要读取少量像素, 内存带宽消耗大幅降低(带宽表示单位时
间内传输的数据量)
csharp
复制代码
3).不同纹理类型的默认设置不同
a.3D场景的纹理(如地面、模型贴图): 默认启用Mipmap
b.2D/UI纹理(如: UI图片、2D精灵): 默认关闭(因为"2D/UI通常是固定大小, 不需要远近距离切换")
csharp
复制代码
4).注意事项
a.显存占用增加: 启用Mipmap后, 纹理总显存占用约为原始大小的1.33倍(因为 1 + 1/4 + 1/16 + ... ≈ 4/3), 所以非必
要场景(如UI)务必关闭
b.纹理压缩影响: Mipmap层级会和纹理一起被压缩, 不影响压缩流程, 但要确保压缩格式支持Mipmap(Unity主流格式如ETC2
ASTC都支持)
2.Unity中Mipmap参数
csharp
复制代码
a.Generate Mipmaps
- 作用: 最核心的开关, 勾选后Unity会自动生成完整的Mipmap层级链(分辨率逐级减半的纹理版本), 取消勾选则仅保留原始
分辨率纹理
- 建议: 3D场景纹理(如模型贴图、地面纹理)建议勾选, 2D/UI纹理建议关闭
csharp
复制代码
b.Use Mipmap Limits
- 作用: 启用后可以限制Mipmap的最大生成层级, 避免对小纹理生成过多不必要的层级, 例如一张256 × 256的纹理, 不需要
生成到1 × 1的层级
- 场景: 用于统一控制项目中所有纹理的Mipmap层级上限, 减少显存浪费
csharp
复制代码
c.Mipmap Limit Group
- 作用: 选择预设的层级限制组, 默认是None(Use Global Mipmap Limit), 即使用Project Settings中全局设置的Mipmap
层级限制; 也可以自定义分组来给不同纹理设置不同的层级上限
- 场景: 大型项目中对不同类型纹理(如角色纹理、环境纹理)做精细化显存管理时使用
csharp
复制代码
d.Mip Streaming
- 作用: 启用后Unity会根据相机与物体的距离, 动态加载仅当前需要的Mipmap层级, 而非一次性加载所有层级, 大幅降低显
存占用
- 场景: 开放世界、大尺寸纹理(如 4K/8K 地形贴图)或移动端性能敏感的项目必备
注意: 需要在"Project Settings > Quality"中开启全局Mip Streaming支持
csharp
复制代码
e.Mipmap Filtering
Mipmap本质上是把原始高分辨率纹理, 逐级缩小成一系列低分辨率的小纹理(比如: 2048 -> 1024 -> 512...)这个"缩小"的过
程, 就是靠过滤算法来"计算新像素的颜色值的"
csharp
复制代码
作用: "设置生成Mipmap时的图像过滤算法, 决定Mipmap层级的视觉效果"
- Box: 默认选项, 采用简单的像素平均算法, 速度快但纹理可能偏模糊
- Kaiser: 保留更多细节, 生成的Mipmap更锐利, 适合需要清晰细节的纹理(如角色贴图)
- Mitchell: 平衡锐利度与模糊感, 视觉效果更自然, 适合大多数场景
csharp
复制代码
f.Preserve Coverage
- 作用: 针对带Alpha通道的透明纹理, 比如: UI图标、粒子贴图, 启用后可保持透明区域的"覆盖率", 避免Mipmap层级缩放
后透明边缘出现黑边或失真
- 场景: 所有包含Alpha透明的纹理建议开启
csharp
复制代码
生成Mipmap是把高分辨率纹理逐级缩小, 默认的过滤算法会把"颜色值"和"Alpha值"混在一起平均计算, 而透明纹理的完全透
明区域(Alpha = 0), 默认底色是"黑色"(RGB = 0, 0, 0); 这个平均计算, 会对透明纹理的半透边缘造成致命影响,直接导致
覆盖率丢失, 表现为2个常见问题:
- Alpha值被"拉低": 半透边缘的Alpha值, 比如180、200会和旁边透明区的Alpha = 0一起平均, 结果边缘的Alpha值变低半
透区域变得更"透", 甚至原本的"半透边缘直接消失, 这就是覆盖率丢了"
- 出现黑边/发灰: 半透边缘的颜色值, 会和透明区的"黑色底色(RGB = 0, 0, 0)"一起平均, 比如白色图标边缘的半透区,
平均后会变成灰色, 火焰粒子的半透边缘会变成黑边, 视觉上特别突兀
csharp
复制代码
开启这个选项后, Unity会改变Mipmap的计算规则: 优先保护Alpha通道的覆盖率, 把Alpha值和颜色值的计算做分离优化
- 计算低分辨率Mip层级时, 不会让透明区的Alpha=0过度拉低半透边缘的Alpha值, 保住边缘原本的半透程度避免覆盖率丢失
- 同时会屏蔽透明区的黑色底色对边缘颜色值的影响, 不让颜色被黑色平均, 从根源上避免透明边缘出现黑边、发灰、泛黑的
问题
最终生成的每个Mip层级, 透明纹理的边缘半透过渡自然、无杂色, Alpha通道的透/半透范围和原始纹理一致
csharp
复制代码
g.Replicate Border
- 作用: 生成Mipmap时, 复制纹理的边缘像素来填充层级缩放后的边缘, 避免无缝纹理(如地面、墙面)在远距离渲染时出现
边缘缝隙或黑边
- 场景: 无缝拼接的环境纹理(如地形、瓷砖贴图)建议开启
csharp
复制代码
将无缝纹理想象成一块瓷砖它的左边缘像素和右边缘像素完全一样, 上边缘像素和下边缘像素也完全一样, 这样把多块瓷砖拼
在一起时, 就看不出接缝; 但在生成Mipmap时, 问题就来了, Unity默认会把纹理"包裹"在一个虚拟的黑色边框里来计算缩小
后的像素
a.当计算纹理边缘的Mip像素时, 算法会把边缘像素和外面的黑色虚拟像素一起平均, 导致边缘像素的颜色变深或失真
b.最终低分辨率的Mip层级边缘像素就和原纹理的边缘像素不一样了, 当这些纹理在远处拼接时就会出现细微的黑边或缝隙
csharp
复制代码
Replicate Border是怎么解决问题的
开启这个选项后, Unity会改变计算规则: 在生成Mipmap时, 遇到纹理边缘, 不使用外部的黑色虚拟像素, 而是复制纹理自身
的边缘像素来填充计算
比如: 处理左边缘时, 就用左边缘的像素来代替左边的虚拟像素; 处理上边缘时, 就用上边缘的像素来代替上边的虚拟像素
这样一来, 生成的Mip层级边缘像素, 就和原纹理的边缘像素保持了完全一致,无缝纹理在远处拼接时,就不会出现黑边或缝隙
csharp
复制代码
h.Fadeout to Gray
- 作用: 当Mipmap层级降到最低时, 纹理会逐渐褪色为灰色, 主要用于调试和测试, 快速识别哪些物体使用了最低分辨率的
Mipmap
- 场景: "仅开发调试阶段使用, 正式项目中建议关闭"