图形3.6 纹理压缩
纹理压缩
纹理压缩是为了解决内存、带宽问题,专为在计算机图形渲染系统中存储纹理而使用的图像压缩技术
图片与纹理
图片格式:图片格式是图片文件的存储格式,通常在磁盘、内存中存储和传输文件时使用,如 jpg、png、gif、bmp等
纹理格式:纹理格式是显卡能直接进行采样的纹理数据格式,通常在向显卡中加载纹理时使用
纹理管线
在拿到一张贴图之后,如果设置了纹理压缩格式,CPU就会按照我们设定的格式进行压缩,传递给GPU进行读取;如果不设置纹理压缩格式,GPU无法读取,CPU依旧会进行一次到rgba32的压缩,增加CPU的时间和带宽,同时占用空间依旧很大,没有起到压缩效果
- 图片压缩格式是基于整张图片进行压缩,像素之间的解码过程存在依赖关系,无法直接实现单个像素级别的解析,发挥不了显卡的并行能力;而且无论什么格式的图片在显卡中解码之后都是rgba纹理格式,无法减少显存占用率,同时还需要CPU解压之后才可以被GPU读取,增加了CPU时间和带宽
- 纹理压缩格式是基于块压缩,能够更快读取像素所属字节块进行解压缩,以支持随机访问
- 如果渲染物体时需要在某个坐标上采样纹理,GPU只需要读取该像素所属固定大小字节块并解压缩
常见纹理压缩格式
黄字为常用的几种压缩方式
非压缩格式
RGBA8888(RGBA32):一个像素32位,包含A通道,即一个像素消耗4字节
RGBA4444(RGBA16):一个像素16位,包含A通道,即一个像素消耗2字节
RGB888(RGB24):一个像素24位,无A通道,即一个像素消耗3字节
RGB565(RGB16):一个像素16位,无A通道,即一个像素消耗2字节
DXTC
DXTC纹理压缩格式来源于S3公司提出的S3TC算法,基本思想是把4×4的像素块压缩成一个64或128位的数据块,优点为创建了一个固定大小且独立的编码片段,没有共享查找表或其他依赖关系,简化了解码过程
DXT1
也叫BC1,将4×4的像素块压缩成64位的数据块,包含两个16位的RGB颜色作为像素块中的极端颜色值,通过线性插值计算出两个中间颜色;剩余的32位均分给16个像素,每个像素2位作为索引值来分配4个颜色(00,01,10,11)
- 16位颜色为RGB565,信息放在绿通道精度会高一倍
DXT1只适用于完全透明或完全不透明的贴图(即无透明度信息或只有一位透明度信息)
- 对于没有Alpha信息的贴图,就按照上述方法进行压缩
- 对于有Alpha信息的贴图,则只通过线性插值得到一个中间颜色,三个索引值用于选择颜色,第四个索引值用来判断是透明还是不透明(其实就是一个Alpha Clip)
计算压缩率:由于主要用于没有Alpha信息的贴图,所以参照对象为RGB24。DXT1一共64位数据供16个像素共用,平均每个像素占用4位,压缩比为6:1
R G B 24 D X T 1 = 24 64 16 = 4 = 6 1 \frac{RGB24}{DXT1}=\frac{24}{\frac{64}{16}=4}=\frac{6}{1} DXT1RGB24=1664=424=16
DXT2/3
DXT2/3与DXT1类似,表示颜色信息的64位数据块不变,另外附加了64位数据来表示每个像素的Alpha信息,整个数据块变为了128位;每个像素占用8位,0-3表示透明信息,4-7表示颜色信息
- DXT2已经完成了颜色的混合,改变Alpha将会直接改变颜色值;DXT3的Alpha信息则相对独立
计算压缩率:DXT2/3的参考对象为RGBA32