一、压缩格式一览:
| 平台 | 核心格式 |
|---|---|
| Windows/Mac/Linux (桌面) | DXT1、DXT5、BC4、BC5、BC6H、BC7 |
| Android (移动端) | ETC1、ETC2、ASTC |
| iOS (移动端) | PVRTC、ASTC |
| Web (浏览器) | DXT (桌面端) 、ASTC (移动端) |
二、(桌面端) DXT 和 BC压缩格式:
DXT全称是 DirectX Texture Compression(DirectX 贴图压缩),是微软为DirectX接口设计的纹理压缩标准。
BC全称是 Block Compression (块压缩),它其实是 DXT 格式的官方标准名称。
命名统一:
微软在 DirectX 10 之后,为了规范命名,不再使用 DXT,而是将它们统一改名为 BC 系列。
第一代 (DirectX 9 时代,旧称 DXT)
这部分其实就是我们常用的 DXT1 到 DXT5,专门为普通的 RGB 和 RGBA 图片设计。
标准名称 旧称 (DXT) 主要用途 BC1 DXT1 不透明贴图,压缩比最高 BC2 DXT3 带"硬边缘"透明的贴图(如UI) BC3 DXT5 带"平滑渐变"透明的贴图(最常用) 第二代 (DirectX 10/11 时代,新增)
为了解决法线贴图等特殊需求,以及追求更高画质而加入的新格式。
标准名称 旧称 (DXT) 专长领域 BC4 无 单通道纹理(如高度图、灰度图) BC5 无 双通道纹理(专为法线贴图优化) BC6H 无 HDR(高动态范围)贴图 BC7 无 高品质 RGB/RGBA(最佳画质,现代首选) 所以,BC 就是 DXT 的"学名",代表了这套从 1998 年沿用至今、被所有 GPU 硬件原生支持的纹理压缩技术。你在 Unity 里看到的 BC7 选项,就是 BC 家族里目前画质最好的成员。
核心原理 :名字里的"块"(Block)是指它会将纹理切成 4x4像素 的小块,对每个块单独压缩。这让显卡可以直接读取压缩数据,速度极快。**注意:**BC 格式都要求贴图尺寸是 4 的倍数。
原因:
BC 系列的核心原理是把贴图切成 4x4 像素的块,对每个块单独压缩。如果贴图边长不是 4 的倍数,边缘无法形成完整的块,GPU 就无法直接读取压缩数据。
三、(移动端)ETC1 vs ETC2
- ETC:Ericsson Texture Compression(爱立信纹理压缩)
快速对比表:
| 特性 | ETC1 | ETC2 |
|---|---|---|
| 核心差异 | 不支持透明通道 (Alpha) | 完整支持 RGBA (含透明通道) |
| 硬件要求 | OpenGL ES 2.0 (几乎所有 Android 设备) | OpenGL ES 3.0 (2014年后大部分中高端设备) |
| 压缩质量 | 基准水平 | 质量更高,PSNR 平均提升约 0.5-1 dB |
| 压缩比 | 6:1 (4 bits/像素) | 6:1 (4 bits/像素,RGBA 为 8 bits/像素) |
| 尺寸要求 | 需要 2 的幂次方 | 需要 2 的幂次方 |
四、(移动端)ASTC
ASTC (Adaptive Scalable Texture Compression) 是由 Arm 和 AMD 开发、Khronos Group 发布的先进纹理压缩标准。与 ETC1/ETC2 的固定压缩策略 不同,ASTC 的最大特点是灵活自适应,它已成为现代移动平台(尤其是 iOS 和 Android 中高端设备)的主流选择。
编码逻辑对比:
| 特性 | ETC/传统压缩格式 | ASTC(自适应可伸缩纹理压缩) |
|---|---|---|
| 核心方式 | 固定块大小 (如 4x4 像素块) | 可变块大小 (可选 4x4 到 12x12) |
| 处理逻辑 | 将纹理严格切割成固定大小的块独立压缩,这就要求纹理尺寸必须是块大小的整数倍(如 4 的倍数) | 编码器根据纹理尺寸和选择的块大小,在边缘自动进行**填充(Padding)**或适配处理 |
| 结果 | 对尺寸有严格要求( 2 的幂次方) | 理论上支持任意尺寸 (NPOT) |
完整支持 RGBA + HDR
-
原生支持 Alpha 通道:与 ETC2 相同,无需拆分处理。
-
支持 HDR 纹理:ASTC HDR 扩展可以压缩高动态范围纹理,用于光照等效果。
在相同的存储空间下,ASTC 能提供比 ETC2 更好的画质。学术测试数据如下:
| 格式 | RGBA 纹理 PSNR | 说明 |
|---|---|---|
| ETC2 | ~39.94 dB | 基线质量 |
| ASTC 4x4 | 45.01 dB | 显著高于 ETC2 |
PSNR 值越高表示压缩质量越好,5 dB 的差距在人眼观察下相当明显。
实战选型:Unity 中如何选择块大小?
根据纹理类型选择合适的 ASTC 块大小,可以显著优化内存和包体:
| 纹理类型 | 推荐块大小 | 理由 |
|---|---|---|
| 3D 角色面部、UI 图标 | ASTC 4x4 或 5x5 | 细节丰富,容不得瑕疵 |
| 普通场景贴图、建筑 | ASTC 6x6 | 平衡画质与内存的首选 |
| 大面积背景、地形 | ASTC 8x8 | 细节要求低,内存节约明显 |
| 法线贴图 | ASTC 4x4 或 5x5 | 法线精度敏感,块不宜过大 |
| 带 Alpha 的特效贴图 | ASTC 4x4 或 5x5 | Alpha 通道需要更高精度 |
Unity 官方也建议:在分辨率不变的情况下,提高压缩等级(如从 ASTC 6x6 改为 8x8),纯色背景可减少 3/4 内存而视觉无差异。
ASTC 最大的"代价"------对设备硬件有要求。
| 平台 | 支持情况 | 起始设备 |
|---|---|---|
| iOS | A8 芯片起支持 | iPhone 6、iPad mini 4 及更新机型 |
| Android | OpenGL ES 3.1 / Vulkan | Adreno 4xx (2015)、Mali T624 (2012)、Tegra K1 (2014) 起 |
| Web | 需查询浏览器 WebGL 扩展 | 需 WEBGL_compressed_texture_astc 支持 |
关键结论:2014-2015 年以后的设备基本都支持 ASTC。老旧设备(如 iPhone 5s)不支持,Unity 会自动降级解压为 RGBA32,会导致内存激增。
五、JPEG图像存储格式 和GPU纹理压缩格式
JPEG是一种通用的图像存储格式 ,与你之前问的那些GPU纹理压缩格式,用途完全不同。
核心区别速览
| 特性 | JPEG (存储格式) | DXT/BC/ASTC/ETC (GPU纹理格式) |
|---|---|---|
| 主要用途 | 存储照片、网络传输、磁盘保存 | GPU实时渲染,供显卡直接采样使用 |
| 使用阶段 | 开发资源、最终发布包体 | 游戏运行时 (显存中) |
| 压缩方式 | 复杂变换编码 (DCT/小波) | 块压缩 (Block Compression) |
| 是否开源 | 是 (标准公开) | 大部分是 (ASTC/ETC开源,BC为行业标准) |
1、与GPU压缩格式的本质区别
Unity文档明确指出:GPU在运行时不直接使用JPEG或PNG格式。原因如下:
-
解码成本 :JPEG是面向存储优化的,GPU无法直接解析这种复杂编码。每次渲染都需要CPU解压,性能极差。
-
随机访问:GPU渲染时需要快速任意读取纹理中的像素。JPEG压缩方式效率很低,而BC、ASTC等格式将纹理切成固定小块(如4x4),GPU能瞬间定位并解压。
2、 在Unity中的关系
你在Unity里看一张贴图,流程是这样的:
-
源文件 (JPEG/PNG) :放在
Assets文件夹里,占用硬盘空间小,方便管理。 -
运行时转换 :构建项目时,Unity编辑器自动把JPEG转换成平台对应的格式(如Android转ASTC、Windows转DXT/BC7)。
-
最终格式 (ASTC/BC7) :打进包体里,运行时加载进显存,供GPU直接使用。
JPEG是存硬盘用的"交换格式",ASTC/DXT是供显卡使用的"运行时格式"。
GPU纹理格式的核心目的正是降低显存占用 和减少带宽压力。
省显存 :同样画质,显存占用减少 75%-90%
省带宽 :GPU读取纹理时传输数据更少,渲染速度更快
压缩格式不能 减小硬盘上的包体大小(那是JPEG/PNG的事),它优化的是运行时显存。