纹理压缩——包体控制

什么是纹理压缩

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

图片格式:图片格式是图片文件的存储格式,通常在磁盘、内存中储存和传输文件时使用;例如: JPG、PNG、GIF、 BMP等;

纹理格式:纹理格式是显卡能够直接进行采样的纹理数据格式,通常在向显卡中加载纹理时使用

纹理管线:

  • 纹理压缩格式基于块压缩,能够更快读取像素所属字节块进行解压缩以支持随机访问【随机访问指:如果我们渲染一个物体的时候需要在某个坐标上采样纹理,gpu只需要读取该像素属固定大小字节块,对其进行解压缩即可】
  • 图片压缩格式基于整张图片进行压缩,无法直接实现单个像素的解析
  • 图片压缩格式无法被GPU识别,还需要经CPU解压缩成非压缩纹理格式才能被识别

 压缩格式

非压缩格式 DirectX——DXTC ATI OpenGL——ETC ASTC IOS——PVRTC

RGBA8888 (RGBA32)

一个像素32位,包含A通道,即一个像素消耗4字节
RGBA4444 (RGBA16)
RGB888 (RGB24)

一个像素24位,无A通道,即一个像素消耗3字节
RGB565 (RGB16)

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进行更好的压缩

对于块中每一个纹素,存储其对应插值端点的权重,存储的权重数量可以少于纹素数量,可通过插值得到每一个纹素的权重值, 然后再进行颜色的计算

128位数据块中存储信息

 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以 下版本;

猜你喜欢

转载自blog.csdn.net/weixin_51327051/article/details/125033274