26. Mipmap

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

- 场景: "仅开发调试阶段使用, 正式项目中建议关闭"
相关推荐
小贺儿开发6 小时前
Unity3D 自动化物流分拣模拟
运维·科技·unity·自动化·人机交互·传送带·物流分拣
EQ-雪梨蛋花汤7 小时前
【3D可视化】基于 Unity 的智慧体育馆三维信息可视化大屏实践
3d·unity·信息可视化
weixin_424294677 小时前
Unity 使用Steamworks.NET
unity·游戏引擎
ellis19707 小时前
Unity资源管理框架Addressables总结
unity·游戏引擎
yj爆裂鼓手7 小时前
unity编辑器下ab包模式下textMeshPro文本不显示材质是紫色的异常,真机无异常的问题
unity·编辑器·材质
EQ-雪梨蛋花汤9 小时前
【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题
unity·layui·webgl
淡海水2 天前
【节点】[EvaluateTipThickness节点]原理解析与实际应用
unity·游戏引擎·shadergraph·图形·evaluate·thickness
小贺儿开发2 天前
Unity3D 木胎雕刻
科技·unity·人机交互·互动·雕刻
HY小海2 天前
【Unity游戏创作】常见的设计模式
unity·设计模式·c#·游戏程序
淡海水4 天前
【节点】[EvaluateSimulationAdditionalData节点]原理解析与实际应用
unity·游戏引擎·shadergraph·图形·simulation·evaluate