Unity 贴图压缩格式 笔记

一、压缩格式一览:

平台 核心格式
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里看一张贴图,流程是这样的:

  1. 源文件 (JPEG/PNG) :放在 Assets 文件夹里,占用硬盘空间小,方便管理。

  2. 运行时转换构建项目时,Unity编辑器自动把JPEG转换成平台对应的格式(如Android转ASTC、Windows转DXT/BC7)。

  3. 最终格式 (ASTC/BC7) :打进包体里,运行时加载进显存,供GPU直接使用。

JPEG是存硬盘用的"交换格式",ASTC/DXT是供显卡使用的"运行时格式"

GPU纹理格式的核心目的正是降低显存占用减少带宽压力

  1. 省显存 :同样画质,显存占用减少 75%-90%

省带宽 :GPU读取纹理时传输数据更少,渲染速度更快

压缩格式不能 减小硬盘上的包体大小(那是JPEG/PNG的事),它优化的是运行时显存

相关推荐
xian_wwq1 小时前
【学习笔记】「大模型安全:攻击面演化史」第 03 篇-数据投毒
笔记·学习·ai安全
sheeta19982 小时前
LeetCode 每日一题笔记 日期:2026.06.06 题目:2196. 根据描述创建二叉树
笔记·算法·leetcode
.千余3 小时前
【C++】手写双向链表:list容器模拟实现
开发语言·c++·笔记·学习·其他
Oll Correct3 小时前
实验三十一:配置DHCP中继代理
网络·笔记
是上好佳佳佳呀5 小时前
【数据分析|Day02】数据收集、数据清洗、数据分析笔记
笔记·数据分析
sheeta19986 小时前
LeetCode 补拙笔记 日期:2026.06.07 题目:128. 最长连续序列
笔记·算法·leetcode
xian_wwq6 小时前
【学习笔记】「大模型安全:攻击面演化史」第 05 篇-Agent安全
笔记·学习·ai安全
2401_868534787 小时前
网规笔记真题解析:2024年11月软考网规案例分析
笔记
sheeta19987 小时前
LeetCode 补拙笔记 日期:2026.06.07 题目:1. 两数之和
笔记·算法·leetcode