Carved Marker

貼圖壓縮簡介 [Part 3]

這篇文章將會簡單介紹有名的 S3TC 貼圖壓縮方式。

S3TC 是由 S3 公司所發展出來的,最早用在它的 Savage 系列顯示晶片中。雖然 Savage 顯示晶片並不算成功,但是 S3TC 卻因為微軟公司將其加入 DirectX 而變得相當成功。微軟向 S3 授權 S3TC 技術後,其它公司若在 DirectX 中支援 S3TC(在 DirectX 中稱為 DXTC),則不需另外再付給 S3 費用,因此得到了相當程度的支援。

S3TC 包括五種貼圖壓縮格式,在 DirectX 中,分別稱為 DXT1 ~ DXT5。這些不同的貼圖壓縮格式,其實就是為了透明度(即 alpha channel)所設計的。

DXT1 是 S3TC 中,最基本的壓縮格式。它是用來處理「沒有 alpha channel」或是「alpha channel 為 1 bit」的貼圖。其它的壓縮方式都是只是 DXT1 的變化而已。

DXT1 所用的方法,和 VQTC 類似,也是將貼圖切成許多小區塊,然後再利用 vector quantization 的方式來壓縮。不過,和 VQTC 不同的是,DXT1 的區塊總是 4x4 的大小,而且它將 vector quantization 用在區塊內,而不是像 VQTC 對所有的區塊做 vector quantization。

對每個 4x4 的區塊,儲存了兩個 16 bits 的顏色,顏色的格式是 5-6-5 的 RGB。從這兩個顏色,可以用線性內插的方式,得到另外兩個顏色。簡單的說,如果這兩個顏色分別是 RGB0 和 RGB1,那 RGB2 和 RGB3 可以由下面的式子求出:

  • RGB2 = (2 * RGB0 + 1 * RGB3) / 3
  • RGB3 = (1 * RGB0 + 2 * RGB3) / 2

這樣就得到了四個顏色。區塊中的每個 texel 則是以一個 2 bits 的 index 表示。如果 index = 0,則表示這個 texel 的顏色是 RGB0;index = 1 則是 RGB1;index = 2 則是 RGB2;index = 3 則是 RGB3。以這樣的方式儲存,每個區塊只需要 16x2 + 2x4x4 = 64 bits。因此,在壓縮 16 bits 的貼圖時,壓縮比是 1:4。

DXT1 同時也可以處理「具有 1 bit alpha channel」的貼圖。一般來說,在貼圖中使用 1 bit 的 alpha channel,就是用來註明「透明」的地方。因此,DXT1 的處理方式,是犧牲一個顏色,用它的表示「透明」的 texel。

如果一個區塊需要存放透明色的話,那麼,顏色的產生方式,就變成:

  • RGB2 = (RGB0 + RGB1) / 2

和前面一樣,texel 的 index 仍是 2 bits。index = 0 ~ 2 時,分別是表示 RGB0 ~ RGB2。當 index = 3 時,就表示這個 texel 是「透明」的,它的顏色是黑色,且 alpha = 0。

不過,要怎麼區分「有 alpha」和「沒有 alpha」的情形呢?DXT1 使用了一個簡單的方法:如果 RGB0 比 RGB1 要大的話,那就表示區塊是沒有 alpha 的。相反的,就表示有 alpha channel 了。

當 alpha channel 不只是 1 bit 時,就需要其它的方式了。DXT2 ~ DXT5 就是在處理這種情形。因為它的原理和 DXT1 是相同的,所以就不再多介紹了。不過,DXT2 ~ DXT5 每個 4x4 區塊需要 128 bits,也就是說,它們的壓縮比只有 DXT1 的一半。

因為 S3TC 是針對每個 4x4 的區塊做壓縮,所以可以對貼圖做「部分更新」的動作。要更新貼圖中的某些部分,只要需更新這些部分的區塊即可,其它的區塊則完全不會被影響。所以,「部分更新」是很容易做到的。

在下一篇文章中,會簡單介紹 3dfx 的 FXT1 貼圖壓縮。

[Part 1] [Part 2] [Part 3] [Part 4]

8/1/2000, Ping-Che Chen


Sorry, Traditional Chinese only. This page is encoded in UTF-8.

Copyright© 2000 Ping-Che Chen