貼圖壓縮簡介 [Part 4]
在這篇文章中,會簡單介紹 3dfx 的 FXT1 貼圖壓縮技術。
基本上,FXT1 和 S3TC 是非常類似的。不過,FXT1 使用 8x4 的區塊,而非 S3TC 的 4x4 區塊。而且,相對於 S3TC 只有一種壓縮方式(即 DXT1,DXT2 ~ DXT5 只是將 DXT1 加上 alpha channel 而已),FXT1 有四種不同的方式。這使得在壓縮的時候,可以針對不同的情形,使用最適當的壓縮方式。
FXT1 有四種壓縮方式,都是使用 8x4 的區塊。第一種方式稱為 CC_HI,用來壓縮使用 1 bit alpha channel 來表示「透明 texel」的貼圖。
CC_HI 和 DXT1 非常類似,它也是存放兩個顏色。不過,和 DXT1 不同的是,CC_HI 用的是 15 bits 5-5-5 RGB 的格式,而不是 16 bits 5-6-5 RGB 的格式。
利用線性內插的方式(類似 DXT1 的方式),CC_HI 的兩個顏色會內插出五個顏色,合起來是七個顏色,再加上一個顏色表示「透明 texel」。每個 texel 則使用 3 bits 的 index 來指向這八個顏色。另外,CC_HI 使用 2 bits 的 mode bits 來表示這個區塊是 CC_HI 格式。所以,一個 8x4 的區塊需要 2 + 2x15 + 32x3 = 128 bits。因此,如果貼圖是 16 bits 的話,壓縮比就是 1:4。
第二種方式稱為 CC_CHROMA,它是專門用來存放沒有 alpha channle 的貼圖。基本上,CC_CHROMA 的方式很簡單:它存放四個 15 bits 的顏色,每個 texel 則用一個 2 bits 的 index 指向這四個顏色。它的 mode bits 是 3 bits,還有一個未使用的 bit,所以它需要的空間是 3 + 1 + 4x15 + 32x2 = 128 bits。
第三種方式稱為 CC_MIXED,這個模式非常的複雜。它將 8x4 的區塊分成兩個 4x4 的小區塊,每個小區塊有兩個 16 bits 5-6-5 RGB 的顏色。每個小區塊中的壓縮方式則和 DXT1 幾乎是相同的,但是它不是用顏色的大小來區分「是否有 alpha channel」,而是用一個 alpha bit 來區分。這個模式需要的空間也是 128 bits。
第四種方式則是 CC_ALPHA,是用來處理具有多位元 alpha channel 的模式(類似 DXT2 ~ DXT5)。它使用三個 20 bits 5-5-5-5 ARGB 格式的顏色,並有兩種模式:第一種模式,每個 texel 的 index(2 bits)指向這三個顏色,而第四個顏色則是表示「透明 texel」。第二種模式,則是將區塊分成兩個小區塊,並使用類似 DXT1 的方式(第一個小區塊用 COLOR0 和 COLOR1 為基礎色,而第二個小區塊則用 COLOR1 和 COLOR2 為基礎色),只不過有加上 alpha channel。這個格式的 mode bit 是 3 bits,再加上一個「模式 bit」,所以需要的空間是 3 + 1 + 20x3 + 32x2 = 128 bits。
基本上,FXT1 的壓縮比和 S3TC 並沒有很大的差別,但是一般來說,效果(特別是壓縮 24 bits 或 32 bits 的貼圖)則比 S3TC 要好一些。不過,它的區塊較大,也會使顯示晶片在處理時的效率較差。
FXT1 和 S3TC 都有相對應的 OpenGL extension 來提供支援。所以,如果想要取得更詳細的資料,可以到 OpenGL® Extension Registry 網站取得。S3TC 的 extension 稱為 GL_EXT_texture_compression_s3tc,而 FXT1 的 extension 則稱為 GL_3DFX_texture_compression_FXT1。在 extension 的文件中,有詳細的格式說明。
[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
