硬件纹理压缩如何工作?


13

与像素阵列相比,它压缩数据是显而易见的。

但是,它与常规压缩(例如png,jpeg)有何不同?


什么是“常规压缩”-诸如JPEG和PNG之类的东西?您是否在问这些格式与硬件支持的格式(例如DXT和ASTC)之间的区别?
内森·里德

6
(最后,我对此有所了解!)与PNG / JPEG不同的是随机访问。如果您要访问Texel(XY),则可以快速确定生产该texel所需的少量数据。JPG或PNG可能需要解压缩所有数据!Wikipedia文章的第1部分和第2部分是一个很好的摘要。
西蒙F

正如SimonF所写。这是一个非常广泛的问题,答案取决于您对哪种类型感兴趣。您是否查看了DXT等规范?
imallett 2015年

Answers:


25

正如西蒙(Simon)的评论所暗示的那样,硬件纹理压缩与其他常用图像压缩之间的一个主要区别是前者不使用熵编码。熵编码是使用较短的位字符串来表示源数据中常见的或重复的模式-如在容器格式(如ZIP),许多常见的图像格式(如GIF,JPEG和PNG)以及许多常见的音频中可以看到和视频格式。

熵编码擅长压缩各种数据,但本质上会产生可变的压缩率。图像的某些区域可能没有多少细节(或者您所使用的编码模型可以很好地预测细节),并且需要很少的比特,但是其他区域可能具有复杂的细节,需要更多的比特进行编码。这使实现随机访问变得困难,因为没有直接的方法来计算在给定的(x,  y)坐标。而且,大多数熵编码方案都是有状态的,因此不可能简单地在流中的任意位置开始解码;您必须从头开始建立正确的状态。然而,由于着色器可以随时从纹理中的任何位置进行采样,因此纹理采样需要随机访问。

因此,硬件压缩而不是熵编码,而是使用固定比率的基于块的方案。例如,在DXT / BCn压缩中,纹理被切成4×4像素块,每个像素块以64位或128位编码(取决于选择哪种格式);在ASTC中,不同的格式使用4×4到12×12的块大小,并且所有块均以128位编码。位如何表示图像数据的详细信息在格式之间有所不同(甚至可能在同一图像中从一个块到下一个块也有所不同),但是由于该比率是固定的,因此硬件很容易计算在内存中找到该块的位置包含给定的(xy)像素,并且每个块都是独立的,因此可以独立于任何其他块进行解码。

硬件纹理压缩中的另一个考虑因素是解码应该可以在硬件中有效地实现。这意味着强烈反对繁重的数学运算和复杂的数据流。例如,可以通过对每个块执行少量的8位整数数学运算来填充较小的查找表,然后仅按像素查找适当的表项来解码BCn格式。这需要很少的片上面积,这很重要,因为您可能希望并行解码多个块,因此需要解码硬件的多个副本。

相比之下,基于JPEG的基于DCT的格式每个像素需要大量的数学运算,更不用说在一个块内的像素之间交换和广播各种中间值的复杂数据流。(有关DCT解码的一些细节,请参见本文。)这对于硬件实现而言会是很多麻烦,我想这就是为什么AFAICT(没有GPU硬件曾经实现基于DCT或基于小波的纹理压缩)的原因。 。


极好的答案。您还可以添加一些论文,其中提到在某些情况下您可以自己压缩并使用像素着色器中的客户端代码对其进行解码,而不必依赖于专用硬件。我不知道在现实世界中不会使用它,这可能仅值得研究,但它确实存在。
v.oddou

1
@ Nathan-Reed基于变换的压缩,实际上,Microsoft的Talisman项目使用了称为TREC的压缩方案(作为模式之一)使用了DCT,但与JPEG不同,它允许随机访问块(我怀疑必须有一个包含地址)。这样就可以为各个块提供可变长度的数据,但是这种间接操作对硬件来说是不愉快的-这是VQ TC过时的原因。FWIW我尝试了大约12个TC创意B4 PVRTC;有些是固定速率的,基于变换的,但是“丢失”的系数仍然使用位。类似BTC的固定coeff位置表示“免费”信息。
西蒙F

2
@内森·里德 从我所看到的,所有硬件解码器都可以通过纯逻辑路径(数据路径中的位解码,一些查找,一些数学运算)来实现,而无需循环/寄存器。您是否知道有任何方案会增加周期延迟到纹理查找?(我很有趣地实现了VHDL ETC1解码器)我的印象是每个纹理单元(TU)都嵌入了解码器。
罗曼·皮奎斯

31

“(硬件)纹理压缩的工作原理”是一个大话题。希望我能提供一些见解,而不必重复Nathan的回答的内容。

要求

纹理压缩通常与“标准”图像压缩技术(例如JPEG / PNG)在四个主要方面有所不同,如Beers等人的“ 从压缩纹理渲染”中概述的那样:

  1. 解码速度:您不希望纹理压缩比使用未压缩的纹理要慢(至少不会那么明显)。解压缩也应该相对简单,因为这可以帮助实现快速解压缩,而不会增加硬件和电源成本。

  2. 随机访问:您无法轻松预测给定渲染期间将需要哪些纹理像素。如果访问的纹素的某个子集M来自例如图像的中间,则不必为了确定M而不必解码纹理的所有“先前”线,这一点很重要。对于JPEG和PNG,这是必需的,因为像素解码取决于先前解码的数据。
    请注意,这只是因为您具有“随机”访问权限,并不意味着您应该尝试完全随意地采样

  3. 压缩率和视觉质量:Beers等人(令人信服地)认为,为了提高压缩率而在压缩结果中损失一些质量是一个值得权衡的问题。在3D渲染中,数据可能会被处理(例如,过滤和着色等),因此质量的某些损失可能会被掩盖。

  4. 非对称编码/解码:尽管可能更具争议性,但他们认为使编码过程比解码慢得多是可以接受的。考虑到解码需要以硬件填充速率进行,这通常是可以接受的。(我承认,以最高质量压缩PVRTC,ETC2和其他一些压缩可能更快)

早期历史与技术

得知纹理压缩已经存在了三十多年了,这可能会让某些人感到惊讶。70年代和80年代的飞行模拟器需要访问相对大量的纹理数据,并且考虑到1980年的1MB RAM> 6000美元,减少纹理覆盖区至关重要。再举一个例子,在20世纪70年代中期,即使少量的高速存储器和逻辑,例如足以容纳适度的512x512 RGB帧缓冲器,也可能使您背负小房子的价格。

不过,据我所知,没有明确地被称为纹理压缩,在文献和专利,你可以找到包括技术参考:
一。数学/过程纹理合成的简单形式;
b。使用单通道纹理(例如4bpp),然后将其乘以每个纹理的RGB值,
c。YUV,和
d。调色板(有关使用Heckbert方法进行压缩的文献)

建模图像数据

如上所述,纹理压缩几乎总是有损耗的,因此问题成为试图以紧凑的方式表示重要数据同时处置次要信息的问题之一。下面将要描述的各种方案都有一个隐式的“参数化”模型,该模型近似纹理数据和眼睛响应的典型行为。

此外,由于纹理压缩倾向于使用固定速率编码,因此压缩过程通常包括搜索步骤,以找到一组参数,当将这些参数输入模型时,它们将生成原始纹理的良好近似值。但是,该搜索步骤可能很耗时。
(除了optipng之类的工具,这是PNG和JPEG的典型用法与纹理压缩方案不同的另一个领域)

在进一步发展之前,为了帮助您进一步了解TC,值得研究一下主成分分析(PCA),这是一种非常有用的数据压缩数学工具。

示例纹理

为了比较各种方法,我们将使用下图:

小鹦鹉+文字
请注意,这是一个相当困难的图像,尤其是对于调色板和VQTC方法而言,因为它跨越了大部分RGB颜色立方体,并且只有15%的纹理像素使用了重复的颜色。

PC和(90年代中期以后)控制台纹理压缩

为了降低数据成本,某些PC游戏和早期游戏机也使用了调色板图像,这是矢量量化(VQ)的一种形式。基于调色板的方法假设给定图像仅使用RGB(A)彩色立方体的相对较小的部分。调色板纹理的问题在于,对于所获得的质量,压缩率通常相当适中。压缩为“ 4bpp”(使用GIMP)的示例纹理产生了 再次注意,对于VQ方案,这是一个相对困难的图像。
在此处输入图片说明

具有较大矢量的VQ(例如2bpp ARGB)

受比尔斯(Beers)等人的启发,Dreamcast控制台使用VQ对单个字节的2x2甚至2x4像素块进行编码。调色板纹理中的“向量”为3或4维,而2x2像素块可以视为16维。压缩方案假定这些向量有足够的近似重复。

即使VQ可以以大约2bpp的分辨率达到令人满意的质量,但这些方案的问题在于它需要进行相关的内存读取:从索引图中进行初始读取以确定像素的代码,然后再进行一秒钟以实际获取相关的像素数据。该代码。额外的缓存可以帮助减轻某些延迟,但会增加硬件的复杂性。

使用2bpp Dreamcast方案压缩的示例图像为 2bpp VQ结果。索引图是:2bpp VQ索引图

VQ数据的压缩可以通过多种方式完成,但是IIRC的完成是使用PCA来进行的,然后沿着主矢量将16D矢量划分为2组,从而使两个代表性矢量将均方误差最小化。然后重复该过程,直到产生256个候选载体。然后应用全局k均值/劳埃德算法算法来改进代表。

色彩空间转换

色彩空间转换还利用PCA,注意色彩的全局分布通常沿主轴分布,而沿其他轴的分布则少得多。对于YUV表示,假设如下条件:a)主轴通常在亮度方向上,并且b)眼睛对该方向的变化更敏感。

3dfx Voodoo系统提供了8bpp“窄通道”压缩系统“ YAB”,该系统将每个8位纹理像素拆分为322格式,并将用户选择的颜色转换应用于该数据以将其映射为RGB。因此,主轴具有8个水平,较小的轴各有4个。

S3 Virge芯片有一个稍微简单的4bpp方案,该方案允许用户为整个纹理指定应在主轴上的两种最终颜色以及4bpp单色纹理。然后,每个像素的值将最终颜色与适当的权重混合在一起以产生RGB结果。

基于BTC的方案

倒退数年,Delp和Mitchell设计了一种简单的(单色)图像压缩方案,称为块截断编码(BTC)。本文还包括一种压缩算法,但就我们的目的而言,我们主要对生成的压缩数据和解压缩过程感兴趣。

在该方案中,图像通常分为4x4像素块,实际上可以使用局部VQ算法对其进行独立压缩。每个块由两个“值” ab以及一组4x4的索引位表示,这些索引位标识每个像素要使用的两个值中的哪个。

S3TC:4bpp RGB(+ 1位字母)
尽管有几个颜色变异的图像压缩BTC的提出,我们感兴趣的是Iourcha等人的S3TC,其中一些似乎是有点忘了工作的重新发现Hoffert等人认为用于Apple的Quicktime。

没有DirectX变体的原始S3TC将RGB或RGB + 1位Alpha的块压缩为4bpp。纹理中的每个4x4块都被替换为两种最终颜色AB,通过固定权重的线性混合从中获得最多两种其他颜色。此外,该块中的每个纹理像素都有一个2位索引,该索引确定如何选择这四种颜色中的一种。

例如,以下是使用AMD / ATI压缩器工具压缩的测试图像的4x4像素部分。(从技术上讲,它取自测试图像的512x512版本,但请原谅我没有时间更新示例)。 这说明了压缩过程:计算颜色的平均值和主轴。然后执行最佳拟合,以找到“位于”轴上的两个端点,以及两个派生的这些端点的1:2和2:1混合(或在某些情况下为50:50混合),最小化错误。然后将每个原始像素映射到这些颜色之一以产生结果。
在此处输入图片说明

如果像在这种情况下那样通过主轴合理地逼近颜色,则误差将相对较低。但是,如果像下面所示的相邻4x4块中的颜色更加多样化,则误差会更高。
在此处输入图片说明

使用AMD Compressonator压缩的示例图像将产生:
在此处输入图片说明

由于每个块的颜色都是独立确定的,因此在块边界处可能会出现不连续性,但是,只要保持足够高的分辨率,这些块伪影可能就不会被注意到:
在此处输入图片说明

ETC1:4bpp RGB
爱立信纹理压缩也适用于4x4像素块,但假设与YUV一样,局部像素组的主轴通常与“明暗度”密切相关。然后可以仅通过平均颜色和纹理像素在该假定轴上的投影的高度量化的标量“长度”来表示纹理像素集。

由于这相对于S3TC降低了数据存储成本,因此它允许ETC引入分区方案,从而将4x4块细分为一对水平4x2或垂直2x4子块。这些每个都有自己的平均颜色。该示例图像产生: 喙周围的区域还说明了4x4块的水平和垂直分区。
在此处输入图片说明
在此处输入图片说明

全球+本地

有一些纹理压缩系统可以在全局方案和局部方案之间进行转换,例如Ivanov和Kuzmin的分布式调色板的方案或PVRTC的方法。

PVRTC:4和2 bpp RGBA
PVRTC假定(实际上是双线性)放大图像是对全分辨率目标的良好近似,并且近似值与目标之间的差异(即增量图像)是局部单色的,即具有主导主轴。此外,假设可以在图像上内插局部主轴。

(操作:添加显示故障的图像)

用PVRTC1 4bpp压缩的示例纹理产生: 喙周围区域: 与BTC方案相比,通常消除了块伪影,但是如果源图像中存在强烈的不连续性(例如,周围大约),则有时会出现“过冲”。澳洲鹦鹉头部的轮廓。
在此处输入图片说明

在此处输入图片说明

自然地,2bpp变量比4bpp具有更高的误差(请注意,靠近脖子的蓝色高频区域周围的精度损失),但可以说质量仍然合理:
在此处输入图片说明

减压费用说明

尽管上述方案的压缩算法具有中等到高的评估成本,但是解压缩算法,尤其是用于硬件实现的解压缩算法,相对便宜。例如,ETC1只需要几个MUX和低精度加法器。S3TC有效地多了一些添加单元来执行混合;和PVRTC,再增加一点。从理论上讲,这些简单的TC方案可以使GPU体系结构避免在解压缩阶段之前进行解压缩,从而最大限度地提高内部缓存的效率。

其他方案

应提及的其他常见TC模式为:

  • ETC2-是ETC1的(4bpp)超级集,可改善对颜色分布与“明暗度”不一致的区域的处理。还有一种支持1位alpha的4bpp变体,以及用于RGBA的8bpp格式。

  • ATC-实际上是S3TC的一个很小的变化

  • FXT1(3dfx)是S3TC主题的一个更宏大的变体

  • BC6&BC7:支持ARGB的8bpp基于块的系统。除了HDR模式外,它们还使用比ETC更为复杂的分区系统来尝试更好地模拟图像颜色分布。

  • PVRTC2:2&4bpp ARGB。这引入了其他模式,包括克服图像边界强的限制的一种模式。

  • ASTC:这也是一个基于块的系统,但是稍微复杂一点,因为它有大量针对大范围bpp的可能的块大小。它还包括诸如具有伪随机分区生成器的多达4个分区区域以及索引数据和/或颜色精度和颜色模型的可变分辨率等功能。


1
哇,这应该是某处的博客文章!好答案!
glampert

2
很高兴能为您提供帮助。至于一个博客,我十年前确实写过这篇文章,但我真的没有时间去做。
西蒙F

1
托管旧博客的网站已死。这是最新的存档版本:web.archive.org/web/20160322090245/http
//web.onetel.net.uk/…– ahcox
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.