学习教程来自:【技术美术百人计划】图形 3.6 纹理压缩——包体瘦身术

笔记总结

什么是纹理压缩

纹理压缩是为了解决内存、带宽问题,专门在计算机图形渲染系统中存储纹理而使用的图像压缩技术

为什么要纹理压缩

图片

图片文件的存储格式,在磁盘、内存中存储和传输。缺点: 1. 压缩时基于整张图片,像素之间存在依赖关系,无法随机解析(并发性不好) 2. 只能解析出RGBA格式,无法减少显存和带宽的占用 3. 需要先由CPU进行解压再交给GPU读取
例如:JPG、PNG等

纹理

显卡能够直接进行采样的纹理数据格式,加载时使用。纹理压缩格式基于块压缩,读取时获得像素所在字节块进行解压缩,支持随机访问
例如:DXTC、ETC、ASTC等

常见纹理压缩格式

非压缩格式

格式 说明
RGBA8888(RGBA32) 32bit(4Byte)/Pixel
RGBA4444(RGBA16) 16bit(2Byte)/Pixel
RGBA888(RGB24) 24bit(3Byte)/Pixel
RGBA565(RGB16) 16bit(2Byte)/Pixel

DXTC(DX)

4 X 4 像素 -> 64bit/128bit 数据块

DXT1(BC1) 64bit

适用于不透明信息RGB、只包含透明信息A的贴图

保留极端颜色AD(RGB565)color_0、color_1,插值得到2者中间的2个颜色BC,共计4个颜色值ABCD。下边的索引对应了16个像素取值的序号(00 01 10 11 共计4个颜色)

当RGBA的贴图使用此压缩方法时,压缩后的ABCD四个颜色对应3个正常颜色和1个透明色(取到时表示完全透明,类似于Alpha Clip) #### DXT2/DXT3(BC2) 128bit 相比于DXT1增加了64位表示每个像素的Alpha信息(直接表示,不插值)

后者DXT3分别计算RGB和A再混合,前者先混合RGBA,若A改变也不再重新混合而是直接改变整体颜色 #### DXT4/DXT5(BC3) 128bit 相比于DXT2的Alpha值直接存储,改为2个8bit极端值+16个3bit索引值 #### DXTnm 基于DXT5,Unity的法线压缩方法:压缩后R(归为1)G(不变)B(归为1)A(原R通道值)
上:压缩前
下:压缩后

ATI1(BC4) 64bit

数据块存储单通道(如高度图、光滑度贴图),同DXT5中Alpha通道的处理方式

ATI2(BC5) 128bit

数据块存储2个通道(可用于法线贴图的压缩),1个BC5块相当于2个BC4块。
缺点:需要更多的内存和带宽

BC6/7 128bit

仅在D3D11级图形硬件中支持
BC6:RGB半精度浮点数据压缩(唯一原生存储HDR的BC格式),针对HDR,压缩比6:1
BC7:8位RGB或RGBA数据(一般用于高质量RGBA压缩),针对LDR,压缩比3:1

ETC(OpenGL)

爱立信研发,几乎所有安卓设备支持
4 X 4 像素 -> 64bit 数据块

图片来自开头学习视频(最下边的亮度索引4位存疑)

ETC1 64bit

压缩了RGB24的颜色
|区域|说明|大小|
|:——:|:——:|:——:|
|亮度索引|偏移取值亮度表的索引号|3bit 2|
|像素索引|亮度表中取值的索引号|2bit
2|
|基础颜色|444或333+555|8bit|
|flip|2个子块的横竖|1bit|
|diff|2个基础颜色的类别|1bit|
|||共64bit

ETC2

在ETC1的基础上增加了Alpha通道的支持,要求尺寸为4的整倍数

ASTC 128bit

可以根据不同的图片类型进行不同的压缩,支持LDR、HDR
缺点:兼容性不完善、解码时间长

PVRTC

由Imagination公司为PowerVR显卡设计,不是基于块的算法,将图像分为了低频信号和高频信号

PVRTC 4-bpp(4 bit per pixel) 64bit

区域 说明 大小
A 尺寸为原来1/4的低分辨率图像,14bit(554/4433),1bit标志(左边通道数量) 15bit
B 同A,15bit(555/4443),1bit标志 16bit
调制数据 2bit * 16 = 32bit 32bit
调制标志 确定调制数据的混合方式 1bit
共64bit

混合AB2张图得到最终颜色(不透明标志以A的标志为准)

总结

内容来自开头ppt

画质

RGBA > ASTC 4 x 4 > ASTC 6 x 6 > ETC2 ≈ ETC1

压缩比

名称 压缩比 名称 压缩比
DXT1 6:1 DXT2/3 4:1
DXT4/5 4:1 ATI1 4:1
ATI2 4:1 BC6 6:1
BC7 3:1 PVRTC 6:1
ASTC 4:1 ~ 35.95:1

实际应用中的选择

可参考英伟达和Unity文档,以下内容总结自开头ppt内容

平台 低质量无A 低质量A 高质量
PC DXT1 DXT5 BC7
Android ETC1 ETC2 ASTC
IOS PVRTC2 PVRTC2 ASTC

另:一些限制要求

版本 要求
ETC2 OpenGL ES 3.0/OpenGL 4.3以上版本
ASTC Iphone6以上版本
PVRTC2 Iphone6以下版本

课后作业

结合课程,针对ASTC与ETC2这2个格式进行打包测试,分析内存占用对比。

打包测试

测试场景

以下为针对地板Albedo(一张8K分辨率256MB大小的RGB贴图)进行打包测试

无压缩 RGB24

无压缩:256MB

ASTC 4x4

ASTC 4x4:85.3MB

分析:压缩设置的格式额外带了A通道,所以RGB所占空间为85.3/4*3=63.9MB
因此压缩比例为:63.9/256 ≈ 1/4

ASTC 12x12

ASTC 12x12:9.5MB

分析:同上
因此压缩比例为:(9.5/4*3)/256 ≈ 1/36

ETC2 4bits

ETC2 4bits:42.7MB

压缩比例:42.7/256 ≈ 1/6