本文基于材料收集,概括了几种纹理压缩格局的根本思维,心愿对于学习有所帮忙。

为什么咱们须要纹理压缩格局?

例如R5G6B5、A4R4G4B4、A1R5G5B5、R8G8B8或A8R8G8B8等未经压缩的图片格式,是可能被GPU间接读取的原生纹理格局。但在低端硬件设施或者说挪动平台下,有两个问题须要解决。

一个是内存,例如A8R8G8B8格局中一个像素占4字节,如果是512x512分辨率内存就占用512x512x4 B=1048576 B=1 MB,这种内存耗费在低端设施上根本无法承受。

另一个重要的是数据传输时的带宽,带宽是发热的首恶,在渲染3D场景时,会有大量的贴图被传输到GPU,若不限度,总线带宽很快就会成为瓶颈,手机秒变暖手宝,重大的还会影响渲染性能。

因而咱们须要一种内存占用既小又能被GPU读取的格局——压缩纹理格局。纹理压缩对应的算法是以某种模式的固定速率有损向量量化(Lossy Vector Quantization)将固定大小的像素块编码进固定大小的字节块中。

有损示意对于渲染来说,有损压缩是能够承受的,个别抉择压缩格局时须要在纹理品质和文件大小上寻求一个均衡。

固定速率压缩指的是什么呢?因为GPU须要可能高效的随机拜访一个像素,这意味着对任意像素,解码速度不该有太大的变动。因而,咱们常见的贴图压缩算法都是有损压缩。相同的例如zip则是一种可变速率压缩。

向量量化(Vector Quantization,VQ)是一种量化技术,将一组大量的点(向量)分成具备近似雷同数量的最靠近它们的点的组。每个组用它的质心点示意,因而存在数据误差,实用于有损压缩。放到纹理压缩中来了解,就例如将4x4块像素的色彩以2个基色来示意。

编码和解码速度:一般来说编码速度慢没关系,因为通常纹理压缩只须要在游戏打包时进行一次,对于用户运行时体验齐全没有影响。但解码速度必须足够快,而且基本上不能影响到渲染性能。

压缩比:通常以比特率或每像素的均匀比特数(bits per pixel,bpp)示意,常见的为2~8bpp。个别RGB原生纹理的像素指24位,4bpp示意每像素占4位,所以也能够认为4bpp示意压缩比为6:1。

顺便一提,在Unity中,任何图片文件格式都存在一个导入过程,导入后的文件格式都是Texture2D,在Texture2D的导入设置选项中须要针对不同平台设置纹理压缩格局。

为什么咱们不应用png、jpg这类常见的压缩格局?

只管像jpg、png的压缩率很高,但并不适宜纹理,次要问题是不反对像素的随机拜访,这对GPU相当不敌对,GPU渲染时只应用须要的纹理局部,咱们总不可能为了拜访某个像素去解码整张纹理吧?不晓得程序,也不确定相邻的三角形是否在纹理上采样也相邻,很难有优化。这类格局更适宜下载传输以及缩小磁盘空间而应用。

常见纹理压缩格局
ETC
ETC(Ericsson Texture Compression)最后为挪动设施开发,现在它是安卓的规范压缩计划,ETC1在OpenGL和OpenGL ES中都有反对。

其原理简略来说,是将4x4的像素块编码为2x4或4x2像素的两个块的办法,每个块指定一个基色,每个像素的色彩通过一个编码为绝对于这些基色偏移的灰度值确定。

具体来说,ETC1每4x4像素块编码为64位的字节数据,每一个像素块又分为两个2x4子块(由一个“flip”位管制程度或竖直划分),每个子块蕴含一个3位的润饰表索引(modifier table index)和一个根本色彩值,这两个色彩值要么是2*R4G4B4要么是R5G5B5+R3G3B3(由一个“ diff”位管制是哪一种)。

3位的润饰表索引对应于8种润饰值:

这样一个子块由1个根本色彩值和4个润饰值能够确定出4种新的色彩值:

color0 = base_color + RGB(modifier0, modifier0, modifier0)
color1 = base_color + RGB(modifier1, modifier1, modifier1)
color2 = base_color + RGB(modifier2, modifier2, modifier2)
color3 = base_color + RGB(modifier3, modifier3, modifier3)

最终的色彩就是从这4个色彩值中选出。其原理就是另外32位数据中蕴含16个2位选择器数据,每个像素的色彩都依据2位选择器的值从这4种中选出。

ETC1编码方式直观图如下:

Unity的几种ETC纹理压缩格局:

RGB ETC1 4 bit:4 bits/pixel,对RGB压缩比6:1,不反对Alpha,绝大部分安卓设施都反对。

RGB ETC2 4 bit:4 bits/pixel,对RGB压缩比6:1。不反对Alpha,ETC2兼容ETC1,压缩品质可能更高,但对于色度变动大的块误差也更大,须要在OpenGL ES 3.0和OpenGL 4.3以上版本。

RGBA ETC2 8bit:8 bits/pixel,对RGBA压缩比4:1。反对齐全的通明通道,版本要求同上。

RGB +1bit Alpha ETC2 4bit:4 bits/pixel。反对1bit的Alpha通道,也就是只反对镂空图,图片只有通明和不通明局部,没有两头的透明度。

EAC:外围原理与ETC雷同,但它只用于单通道或双通道数据,OpenGL ES 3.0和OpenGL 4.3后的设施大部分反对,但因为安卓平台形形色色的兼容性,个别不倡议用单双通道贴图。

DXT
原名S3TC(S3 Texture Compression ),由S3 Graphics开发的一种与组块无关的有损压缩算法,也叫DXTn或DXTC(DirectX Texture),是块截断编码(Block Truncation Coding)的一种改良。因为版权专利个别用于Windows平台。

其原理简略来说,是由一对低精度的“基色”来形容一个4x4的RGB像素块,并容许每个像素在这些基色之间指定一个插值。S3TC有多种变体,每种都是为特定类型的图像数据设计,但它们都是将4x4的像素块转换为64位或128位的数据。

BC1(Block Compression)是最小的一种变体,也是转换比最高的一种,在不须要高精度也不须要a值时能够应用。它将4x4个像素作为一个块(block)存储64位数据,其中包含两个16位RGB值(R5G6B5,人眼对绿色更敏感)$color_0$和$color_1$,和16个2位选择器值,一个像素最终的色彩值由$color_0$、$color_1$和对应的2位选择器值决定。混合公式如下:

它的工作形式直观图如下:

PS:BC1的信息失落次要集中在比拟细的边界上,可进步分辨率来解决,高宽放大41%(1.41*1.41=1.9881),这样整个纹理差不多是以前的2倍,但总的压缩率还能放弃为3:1。另一个损失是24位RGB转为了16位色彩,看上去差异不大,但对于渐变色带来说就有一些细微差别了。

PPS:在Unity 2017中新增了基于Crunch库的改进版DXT算法,占用磁盘空间更小,解压速度更快,然而相应的图像品质不如DXT那么好。

BC2在BC1的根底上反对了a值。它将4x4共16个像素存储为128位数据,其中包含64位a通道(每像素4位)和64位色彩通道,色彩和DXT1统一,即两个16位RGB值和16个2位索引表x。它的透明度只有4位共16种数值,相比DXT5有些性能根本没人用。DXT2和DXT3的差异在于是否是预乘过的色彩。

BC3在BC2的根底上改良了a值算法。BC3将4x4共16个像素存储为128位数据,其中包含64位a通道(两个8位a值和一个4x4的3位索引表)和64位色彩通道,色彩和DXT1一样,即两个16位RGB值和16个2位索引表x。因为a值采纳了和色彩一样相似的块压缩算法,所以数值范畴更广,BC是比拟常见的。

BC4和BC5在D3D10中可用,只能存储一个/两个色彩通道。

BC6H和BC7在D3D11中可用。BC6H是一个不带a值的HDR格局,它将4x4共16个像素存储为128位数据,其中包含两个48位的RGB值(16:16:16),每个色彩重量都是带符号浮点值(1个符号位 + 5个指数位 + 10个尾数位),以及16个2位索引表。

BC7相比其它有点非凡,尽管它也是将4x4共16个像素存储为128位数据,但它的最低无效位为Mode位,(最低无效位即最低的非0位)依据不同模式,色彩值的存储格局不同,是否有a值或a值的存储格局也不尽相同,是一种比拟灵便的存储格局,但这也意味着解码所带来更多的耗费。

PVRTC
PVRTC(PowerVR Texture Compression)由Imagination公司专为PowerVR显卡外围设计,因为专利起因个别它只被用于苹果的设施,仅iPhone、iPad和局部PowerVR的安卓机反对。这可能是这几种压缩格局中最不公开的技术。

PVRTC不同于DXT和ETC这类基于块的算法,而将整张纹理分为了高频信号和低频信号,低频信号由两张低分辨率的图像A和B示意,这两张图在两个维度上都放大了4倍,高频信号则是全分辨率但低精度的调制图像M,M记录了每个像素混合的权重。要解码时,A和B图像通过双线性插值(Bilinearly)宽高放大4倍,而后与M图上的权重进行混合。

PVRTC 4-bpp模式下,每4x4像素占一个64位数据块,2-bpp模式下每8x4像素会有一个64位数据块。两者大同小异,咱们仅说4-bpp模式。

4-bpp模式下,A和B图放大后都只保留一个色彩值,如下图所示,A图比B图少1位,但两张图都能够抉择以RGB或ARGB的形式存储(最高位决定为哪种),A色能够用RGB554或ARGB3443格局编码,B色能够用RGB555或ARGB3444格局编码。

在解码时,为了解码任意像素,必须读取4个相邻的PVRTC块,应用这4个块来解码一个5x5块。

应用双线性过滤来对A和B图进行扩充,而后A和B图依据M图与“Mode”位进行混合,这里的"Mode"位为1时,M图中10值像素被看作是开启了“punch-through alpha”,Alpha通道会被强制清零,这种神奇的操作是为了兼容旧应用程序,具体就不说了。

单从4-bpp模式来看,PVRTC和BC、ETC十分类似,都有两个色彩值,但根本思维却是不同的。

Unity的几种PVRTC的纹理压缩格局:

苹果的所有挪动设施都反对PVRTC。

PVRTC2品质比PVRTC更高,而且反对NPOT(非2次幂纹理),是PVRTC的升级版。

PVRTC和PVRTC2都反对4-bpp和2-bpp的ARGB格局。

RGB PVRTC 4 bit:4 bits/pixel,对RGB压缩比6:1,安卓设施须要PowerVR Series 5以上。

RGBA PVRTC 4 bit:4 bits/pixel,对RGBA压缩比8:1,3位Alpha值,设施同上。

RGB PVRTC 2 bit:2 bits/pixel,对RGB压缩比6:1,安卓和iOS设施须要PowerVR Series 5X以上。

RGBA PVRTC 2 bit:2 bits/pixel,对RGBA压缩比8:1,3位Alpha值,设施同上。

ASTC
ASTC(Adaptive Scalable Texture Compression),由ARM和AMD联合开发,2012年公布,是较新的一种压缩格局,惟一一个不受专利权影响的压缩格局。ASTC在压缩率、图像品质、品种上都挺不错的,也正在逐渐代替前三种,最大的毛病可能就是兼容性还不够欠缺和解码工夫较长,但以当初挪动端的发展趋势来看,GPU计算能力越来越难成为瓶颈,因而十分有心愿在当前能成为对立的压缩格局。

ASTC也是一种基于块的有损压缩算法,它很像BC7,不同的是块中像素数量可变,它的特点有很多:

  • 较高的灵活性:反对1-4重量的贴图
  • 压缩率/品质灵便可变:依据不同图片会抉择不同压缩率级别的算法
  • 反对2D/3D贴图
  • 跨平台:iOS、安卓、PC
  • 同时反对LDR和HDR:BC6H尽管反对HDR但不反对Alpha通道

ASTC格局的块为固定大小的128位。2D纹理编码中,它从4x4到12x12像素都有,对应的压缩比从3:1到27:1。所有反对的块和比特率如下:

Increment列示意压缩比的增量,这也示意ASTC的比特率能够在小数级变动,这种技术称为BISE(Bounded Integer Sequence Encoding)。

ASTC的压缩非常复杂,分了很多可变的配置数据,也不打算再深入研究了。

但要留神的是只管纹理能够被编码为1-4通道图像,然而解码后的值总是以RGBA格局输入。在LDR sRGB模式下,色彩值以8位整数的模式返回,而如果是HDR则将以16位浮点数的模式返回。

《ASTC纹理压缩格局》对ASTC做了具体的测试,十分倡议去看看。

总结

整顿了下网上的材料,以2020年市场上的挪动设施反对来看:

  • 安卓:用ETC2没有什么问题;至于ASTC在Android 5.0/OpenGL ES 3.1后反对,市场大部分机型都反对(98.5%),能够思考抉择,但毕竟是安卓,要做好解决兼容性的心里筹备。
  • iOS:在iPhone6以上(蕴含)都反对ASTC,6以下能够抉择PVRTC2。

最初,所有压缩格局的简要形容如下,灰色框示意曾经过期了或根本不必了。


参考起源:

TEXTURE COMPRESSION TECHNIQUES

Recommended, default, and supported texture compression formats, by platform

Another Milestone for ASTC Texture Compression

ASTC does it

《ASTC纹理压缩格局》

《挪动平台纹理压缩格局抉择》

Why use crunch compression?

Crunch compression of ETC textures

ETC1 Compressed Texture Image Formats

Texture compression on mobile demystified

Texture compression using low-frequency signal modulation


这是侑虎科技第1187篇文章,感激作者蕾芙丽Reverie供稿。欢送转发分享,未经作者受权请勿转载。如果您有任何独到的见解或者发现也欢送分割咱们,一起探讨。(QQ群:793972859)

作者主页:https://www.zhihu.com/people/...

再次感激蕾芙丽Reverie的分享,如果您有任何独到的见解或者发现也欢送分割咱们,一起探讨。(QQ群:793972859)