什么是纹理压缩
纹理压缩是为了解决内存、带宽问题,专为在计算机图形渲染系统中存储纹理而使用的图像压缩技术
图片格式:图片格式是图片文件的存储格式,通常在磁盘、内存中储存和传输文件时使用;例如: JPG、PNG、GIF、 BMP等;
纹理格式:纹理格式是显卡能够直接进行采样的纹理数据格式,通常在向显卡中加载纹理时使用
纹理管线:
- 纹理压缩格式基于块压缩,能够更快读取像素所属字节块进行解压缩以支持随机访问【随机访问指:如果我们渲染一个物体的时候需要在某个坐标上采样纹理,gpu只需要读取该像素属固定大小字节块,对其进行解压缩即可】
- 图片压缩格式基于整张图片进行压缩,无法直接实现单个像素的解析
- 图片压缩格式无法被GPU识别,还需要经CPU解压缩成非压缩纹理格式才能被识别
压缩格式
非压缩格式 | DirectX——DXTC | ATI | OpenGL——ETC | ASTC | IOS——PVRTC |
RGBA8888 (RGBA32) 一个像素32位,包含A通道,即一个像素消耗4字节 一个像素24位,无A通道,即一个像素消耗3字节 | DXT1 (BC1) DXT2 (BC2) DXT3 (BC2) DXT4 (BC3) DXT5 (BC3) | ATI1 (BC4) ATI2 (BC5) BC6H BC7 | ETC1 ETC2 | PVRTC PVRTC2 |
DXTC
DCTC纹理压缩格式来源于S3公司提出的S3TC算法,基本思想是把4x 4的像素块压缩成一个64或128位的数据块,优点为创建了一个固定大小且独立的编码片段,没有共享查找表或其他依赖关系,简化了解码过程
- DXT1:适用于没有Alpha信息的贴图
每一个块具有2个16位RGB颜色值(RGB565),代表了此4x4像素块中颜色极端值,然后通过线性插值计算出两个中间颜色值,16个2位索引值则表示了每一个像素的颜色值索引
【压缩比6:1】
- DXT2/3
DXT2/3与DXT1类似,表示颜色信息的64位数据块不变,另外附加了64位数据来表示每个像素的Alpha信息,整个数据块变为了128位; ;每个像素占用8位,0-3表示透明信息,4-7表示颜色信息
【压缩比4:1】
- DXT4/5
DXT4/5与DXT2/3的差异在于其Alpha信息是通过线性插值所得的,表示颜色信息的64位数据块依然不变,而Alpha信息则由2个8位Alpha极端值和16个3位索引值组成
ATI
- ATI1/2
ATI1为ATI公司开发的纹理压缩格式,也被称为BC4, 其每个数据块存储单个颜色的数据通道,以与DXT5中的Alpha数据相同的方式进行编码,常用于存储高度图、光滑度贴图,效果与原始图像基本无差异
【压缩比:2:1】
ATI2也被称为BC5,每一个块中存储两个颜色通道的数据,同上以与DXT5中AIpha数据相同的方式进行编码,相当于存储了两个BC4块
【压缩比:2:1】
如果是在将法线存储在XY双通道中采用BC5格式压缩,由于每个通道都有自己的索引,因此法线贴图XY信息可以比在BC1中保留更多的保真度,缺点是需要使用两倍内存,也需要更多的带宽才能将纹理传递到着色器中
- BC6/7
BC6和BC7仅在D3D11级图形硬件中受支持,他们每个块占用16字节,BC7针对8位RGB或RGBA数据,而BC6针对RGB半精度浮点数据,因此BC6是唯一一个可以原生存储HDR的BC格式
BC6是专门J针对HDR (高动态范围)图像设计的压缩算法,【压缩比6:1】
BC7是专门J针对LDR (低动态范围)图像设计的压缩算法,【压缩比3:1】,该格式用于高质量的RGBA压缩,可以显著减少由于压缩法线带来的错误效果
ETC
几乎所有的安卓设备都可以支持ETC压缩。ETC方案与DXTC具有相同特点,将4 x4的像素单元压缩成64位数据块,并将像素单元水平或竖直朝向分为两个区块,每个像素颜色等于基础颜色加上索弓|指向的亮度范围。
- ETC1
ETC1每一个数据块分区中的4位亮度索引信息会从16个内置亮度表中获取当前像素单元对应的亮度表,每个像素的2位像素索引值可以从亮度表的四个值中选取对应的亮度补充值
【压缩率6:1】
- ETC2
ETC2是ETC1的扩展,支持了Alpha通道的压缩,硬件要求OpenGL ES 3.0和OpenGL4.3以上
ASTC
ASTC是由ARM和AMD联合开发的纹理压缩格式,ASTC在各项指标上都挺不错,优点是可根据不同图片选择不同压缩率的算法,图片不需要为2的幂次,同时支持LDR和HDR,缺点是兼容性不够完善且解码时间较长
ASTC也是基于块的压缩算法,与BC7类似,其数据块大小固定为128位,不同的是块中的像素数量可变,从4x4到12x 12像素都有
每一个数据块中存储了两个插值端点,但不一定存储的是颜色信息,也可能是L .ayer信息,这样可以用来对Normal或Alpha进行更好的压缩
对于块中每一个纹素,存储其对应插值端点的权重,存储的权重数量可以少于纹素数量,可通过插值得到每一个纹素的权重值, 然后再进行颜色的计算
![](https://i-blog.csdnimg.cn/blog_migrate/7e211a0f0206f4586a691479646bb455.png)
PVRTC
PVRTC由Imagination公司专为PowerVR显卡设计,仅支持Iphone、Ipad和部分安卓机;不同于DXTC和ETC这类基于块的算法,PVRTC将图像分为了低频信号和高频信号,低频信号由两张低分辨率图像AB组成,高频信号则是低精度的调制图像,记录了每个像素混合的权重,解码时AB图像经过双线性插值放大,然后根据调制图像的权重进行混合
- PVRTC
PVRTC 4-bpp(每一个像素占4位)把一个4 x 4的像素单元压成一 个64位数据块,每一个块中存储一个32位的调制数据,一个1位的调制标志,15位的颜色A,1位颜色A不透明标志,14位颜色B,1位颜色B不透明标志;而PVRTC 4-bpp则是把一个4 x 4的像素单元压成了64位数据块;
【rgb压缩率6:1 rgba压缩率8:1】
总结
PC:
①低质量使用DXT1格式不支持A通道,使用DXT5格式支持A通道;
②高质量使用BC7格式,支持A通道;
安卓:
①低质量使用ETC1格式,但不支持A通道;
②低质量使用ETC2格式,支持A通道,需要在OpenGL ES 3.0/OpenGL 4.3以上版本;
③高质量使用ASTC格式,需要在Android 5.0/OpenGL ES 3.1以上版本;
IOS:
①高质量使用ASTC格式,需要lphone6以 上版本;
②低质量使用PVRTC2格式,支持lphone6以 下版本;