学习教程来自:【技术美术百人计划】图形 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的贴图
下:压缩后
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 数据块
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
ASTC 4x4
分析:压缩设置的格式额外带了A通道,所以RGB所占空间为85.3/4*3=63.9MB
因此压缩比例为:63.9/256 ≈ 1/4
ASTC 12x12
分析:同上
因此压缩比例为:(9.5/4*3)/256 ≈ 1/36
ETC2 4bits
压缩比例:42.7/256 ≈ 1/6