Carved Marker

貼圖壓縮簡介 [Part 1]

貼圖是在 3D 場景中,增加真實性的一個重要的工具。就像一般的影像一樣,貼圖的大小愈大,它的圖像就愈精細。事實上,貼圖往往需要比一般的影像更大。因為,在 3D 場景中,觀察者可能會很靠近貼圖,使得貼圖需要放大很多倍,而造成模糊的現象。所以,一般來說,如果可能的話,貼圖愈大就愈好。

不過,貼圖是非常佔用記憶體空間的。現在的貼圖都是以不壓縮的形式存放在顯示記憶體中,而目前常用的貼圖格式是 16 bits、24 bits 和 32 bits。下表列出一些貼圖大小所佔用的空間:

貼圖大小16 bits16 bits mipmap24 bits24 bits mipmap32 bits32 bits mipmap
64x648 KB10.6 KB12 KB16 KB16 KB21 KB
256x256128 KB170 KB192 KB256 KB256 KB340 KB
1024x10242 MB2.6 MB3 MB4 MB4 MB5.3 MB

現在一般的顯示卡上通常裝有 32MB 的顯示記憶體。如果每個貼圖都要 2MB 的話,即使不計 frame buffer 所佔用的空間,也只能使用 16 張貼圖。這顯然是不可接受的。所以,現在的遊戲通常無法使用很大的貼圖。

然而,在儲存一般的影像的時候,通常會使用某些壓縮方式。現在常見的 JPEG 壓縮,可以達到 1:6 甚至 1:12 的壓縮比。如果把類似的壓縮方式應用在貼圖上,不就可以大量減少貼圖所用的空間了嗎?

不幸的是,一般的影像壓縮方式,是沒有辦法用在貼圖上面的。因為,顯示晶片在存取貼圖時,是一種「隨機存取」的動作。也就是說,顯示晶片通常會需要以任意的順序存取貼圖裡的資料。一般的壓縮方式如 JPEG,都利用了 variable length 的 coding,簡單的說,它們必需以一定的順序才能解開。因此,不能用這種方式來壓縮貼圖。

一種壓縮方式,是改變顏色空間。例如,3dfx 的 YAB 格式,就是一種不同的顏色空間。利用 YAB,每個像點只需要 8 bits,就可以達到接近 16 bits 的效果。不過,無論如何,這樣都使顏色的數目減少。因此,整個貼圖的色彩變化就受到了限制。

另一種方式,就是用傳統的「調色盤」結構。利用一個 256 種顏色的調色盤,就可以把貼圖以 8 bits 的方式儲存。不過,雖然它的色彩空間較大(可以是 24 bits 或 32 bits),但是總顏色數目還是不能超過 256 種。所以,它的應用範圍仍然有限。

現在常用的貼圖壓縮方式,則是利用以區塊為基礎的方式。通常的做法是,把貼圖切割成許多小區塊,再對各個區塊進行壓縮。例如,S3TC 就是把貼圖切成 4x4 的小區塊。利用這種做法,就可以對區塊進行某種處理(通常就是 vector quantization 或是其變形),顯示晶片也可以區塊為單位,進行隨機的存取動作。因此,這是適合用在貼圖的方式。

不過,區塊的大小會影響到壓縮的效果。一般來說,區塊愈大,就能有愈高的壓縮比。不過,愈大的區塊也會使額外的負擔增加。因為顯示晶片只能以區塊為單位來讀取貼圖資料,如果區塊愈大,則每個區塊中就可能會有愈多的資料是不需要的。所以,也不能任意把區塊的大小加大。

接下來的文章中,會簡單介紹一些常見的貼圖壓縮方式。

[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