【从UnityURP开始探索游戏渲染】专栏-直达
纹理压缩技术发展节点
- 早期阶段 2000年代初
- DXT/S3TC成为PC和主机平台主流,采用4×4像素块压缩,但移动端支持有限。
- PVRTC(2008年)专为PowerVR GPU设计,要求纹理尺寸为2的幂次方且宽高相等,成为iOS早期标准。
- 移动平台标准化 2012-2014年
- ETC1(2012年)成为Android基础格式,但缺乏透明通道支持。
- ETC2(OpenGL ES 3.0强制支持)扩展了RGBA和sRGB支持,2013年后中高端Android设备普及。
- ASTC(2012年推出)由ARM开发,支持灵活分块(4x4至12x12)和NPOT纹理,2014年后A8/iPhone 6及以上设备支持。
- 现代统一化趋势 2020年后
- ASTC逐渐成为Android/iOS首选,压缩比和质量优于ETC2/PVRTC。
- Unity Crunched压缩(如ETC2+二次压缩)用于进一步减少纹理体积。
ASTC(Adaptive Scalable Texture Compression)
实现原理
- 分块压缩:将纹理划分为4×4至12×12像素的块(Block),每个块独立压缩为128位固定大小。
- 颜色插值:每个块存储2个端点颜色(RGB或RGBA)和权重网格(Weight Grid),通过插值计算中间颜色值。
- 动态分区:根据颜色分布自动选择最优分区方式(如4×4块可拆分为2×2子块),平衡压缩比与质量。
示例
- ASTC 4×4 RGBA:
- 原始数据:4×4=16像素×32位(RGBA)= 512位
- 压缩后:128位(8:1压缩比)
- 解码时,通过端点颜色和权重插值还原每个像素的RGBA值。
ETC2(Ericsson Texture Compression 2)
实现原理
- 4×4块压缩:每个块分为两个2×4子块,子块间通过1位标记选择横/竖分割方式。
- 颜色模式:
- Individual模式:子块独立存储RGB444颜色(高对比度区域)。
- Differential模式:子块存储RGB555基色+RGB333偏移量(低对比度区域)。
- 透明通道:通过额外64位数据存储Alpha值(ETC2+Alpha)。
示例
- ETC2 RGB:
- 原始数据:4×4=16像素×24位(RGB)= 384位
- 压缩后:64位(6:1压缩比)
- 解码时,根据子块模式选择基色+偏移量计算最终颜色。
PVRTC(PowerVR Texture Compression)
实现原理
- 双通道压缩:仅压缩RGB通道,Alpha通道单独处理(PVRTC2支持RGBA)。
- 颜色索引:每个4×4块存储2个主色(RGB565)和64位颜色索引表,通过插值生成中间颜色。
- 固定尺寸:仅支持2的幂次方纹理(如256×256)。
示例
- PVRTC4:
- 原始数据:4×4=16像素×24位(RGB)= 384位
- 压缩后:64位(6:1压缩比)
- 解码时,通过主色和索引表插值还原颜色,但透明通道需额外处理。
DXT(DirectX Texture Compression)
实现原理
- DXT1:
- 4×4块存储2个RGB565颜色和16位插值索引(无Alpha)。
- DXT5:
- 4×4块存储2个RGB565颜色+2个8位Alpha极值+16位Alpha插值索引。
- 块状伪影:高对比度区域易出现色带(如渐变纹理)。
示例
- DXT1 RGB:
- 原始数据:4×4=16像素×24位(RGB)= 384位
- 压缩后:64位(6:1压缩比)
- 解码时,通过端点颜色和插值索引计算中间颜色。
压缩方式对比
| 格式 | 压缩比 | 透明支持 | 适用平台 | 典型问题 |
|---|---|---|---|---|
| ASTC | 4:1~12:1 | 是 | iOS(A8+)/Android(ES3.1) | 低端设备兼容性差 |
| ETC2 | 6:1 | 是(需扩展) | Android(ES3.0+) | 高对比度区域色带明显 |
| PVRTC | 4:1~6:1 | 是(PVRTC2) | iOS | 强制2的幂次方尺寸 |
| DXT | 4:1~6:1 | 是(DXT5) | PC/主机 | 移动端不支持 |
多平台压缩方案对比
| 格式 | 支持平台 | 压缩比 | 优势 | 劣势 |
|---|---|---|---|---|
| ASTC | iOS(A8+)、Android(ES3.1+) | 4x4块=8bit/像素 | 高灵活性,支持NPOT和透明通道4 | 低端Android设备可能不兼容 |
| ETC2 | Android(ES3.0+) | 8bit/像素 | 广泛兼容,支持透明通道2 | 压缩质量低于ASTC,块状伪影明显 |
| PVRTC | iOS(全系列) | 4bit/像素 | 苹果硬件原生优化1 | 强制2的幂次方尺寸,透明通道效果差 |
| DXT | PC/主机 | 4-8bit/像素 | DirectX高效解码2 | 移动端不支持,高细节纹理易失真 |
URP中各平台推荐方案与问题
iOS平台
- 首选ASTC 4x4:平衡质量与性能,但需放弃iPhone 5s等旧设备。
- 备选PVRTC4:兼容性最佳,但渐变和透明区域易出现色带。
Android平台
- 高端设备ASTC:需检测OpenGL ES 3.1支持,否则回退ETC2。
- ETC2通用方案:可通过分离Alpha通道(ETC1+Alpha图)优化透明纹理,增加复杂度。
特殊情况处理
- 高保真需求:使用RGBA32无压缩,但内存占用激增(如1024x1024纹理达16MB)。
- 渐变纹理:RGBA16结合Dithering抖动处理,减少色阶断裂。
性能优化建议
- 平台检测:通过
SystemInfo.SupportsTextureFormat动态选择压缩格式。 - 分级压缩:根据纹理用途(UI/场景)采用不同压缩级别,UI优先ASTC/ETC2,背景可用PVRTC。
- 冗余检查:避免AssetBundle重复打包纹理导致内存翻倍
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)
纹理压缩技术发展节点 早期阶段 2000年代初 DXT/S3TC成为PC和主机平台主流,采用4×4像素块压缩,但移动端支持有限。 PVRTC(2008年)专为PowerVR GPU设计,要求纹理尺