貼圖壓縮簡介 [Part 1]
貼圖是在 3D 場景中,增加真實性的一個重要的工具。就像一般的影像一樣,貼圖的大小愈大,它的圖像就愈精細。事實上,貼圖往往需要比一般的影像更大。因為,在 3D 場景中,觀察者可能會很靠近貼圖,使得貼圖需要放大很多倍,而造成模糊的現象。所以,一般來說,如果可能的話,貼圖愈大就愈好。
不過,貼圖是非常佔用記憶體空間的。現在的貼圖都是以不壓縮的形式存放在顯示記憶體中,而目前常用的貼圖格式是 16 bits、24 bits 和 32 bits。下表列出一些貼圖大小所佔用的空間:
| 貼圖大小 | 16 bits | 16 bits mipmap | 24 bits | 24 bits mipmap | 32 bits | 32 bits mipmap |
| 64x64 | 8 KB | 10.6 KB | 12 KB | 16 KB | 16 KB | 21 KB |
| 256x256 | 128 KB | 170 KB | 192 KB | 256 KB | 256 KB | 340 KB |
| 1024x1024 | 2 MB | 2.6 MB | 3 MB | 4 MB | 4 MB | 5.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
