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

- 场景: "仅开发调试阶段使用, 正式项目中建议关闭"
相关推荐
咸鱼永不翻身3 小时前
Unity视频资源压缩详解
unity·游戏引擎·音视频
在路上看风景4 小时前
4.2 OverDraw
unity
在路上看风景4 小时前
1.10 CDN缓存
unity
ellis197014 小时前
Unity插件SafeArea Helper适配异形屏详解
unity
nnsix15 小时前
Unity Physics.Raycast的 QueryTriggerInteraction枚举作用
unity·游戏引擎
地狱为王15 小时前
Cesium for Unity叠加行政区划线
unity·gis·cesium
小贺儿开发1 天前
Unity3D 八大菜系连连看
游戏·unity·互动·传统文化
在路上看风景1 天前
25. 屏幕像素和纹理像素不匹配
unity
ۓ明哲ڪ1 天前
Unity功能——创建新脚本时自动添加自定义头注释
unity·游戏引擎