紋理格式對比

轉自:http://blog.csdn.net/ynnmnm/article/details/44983545

總結:

移動端主要用ETC1和ETC2

ETC1不支持透明,ETC2支持透明

ETC2需要設備支持OpenGL ES 3.0

 

簡單紋理格式

  • RGBA8888 每個像素4字節,RGBA通道各佔用8位
  • RGBA4444 每個像素2字節,RGBA通道各佔用4位
  • RGB888 每個像素3字節,RGB通道各佔用8位,無透明通道
  • RGB565 每個像素2字節,RGB通道各佔用5/6/5位,無透明通道
  • RGBA5551 每個像素2字節,RGB通道各佔用5位,透明通道1位,所以要麼完全透明要麼不透明

DXT紋理壓縮格式

DXT紋理壓縮格式來源於S3(Silicon & Software Systems)公司提出的S3TC(S3 Texture Compression),基本思想是把4x4的像素塊壓縮成一個64或128位的數據塊,是有損壓縮方式。DXT1-DXT5是S3TC算法的五種變化,用於各種Windows設備。

DXT1

DXT1格式主要適用於不具透明度的貼圖或僅具一位Alpha的貼圖(非完全透明則即完全不透明),對於完全RGB565格式的貼圖,DXT1具有4:1的壓縮比,即平均每個像素顏色佔4位,雖然壓縮比並不是很好,但是DXT的特性使得它更適合用於實時遊戲之中。

DXT1將每4×4個像素塊視爲一個壓縮單位,壓縮後的4×4個像素塊佔用64位,其中有2個16位的RGB顏色和16個2位索引,格式描繪如下圖所示: 
這裏寫圖片描述

DXT1中的兩個RGB顏色負責表示所在壓縮的4×4像素塊中顏色的兩個極端值,然後通過線性插值我們可以再計算出兩個中間顏色值,而16個2位索引則表明了這4×4個像素塊所在像素的顏色值,2位可以表示4種狀態,剛好可以完整表示color_0,color_1以及我們通過插值計算出的中間顏色值color_2和color_3,而對於具有一位Alpha的貼圖,則只計算一箇中間顏色值,color_3用來表示完全透明。

對於如何判斷DXT1格式是表示不透明還是具有1位alpha的貼圖,則是通過兩個顏色值color_0和color_1來實現的,如果color_0的數值大於color_1則表示貼圖是完全不透明的,反之則表示具有一位透明信息。因爲只有一位 Alpha 信息,所以只能表示透明或不透明,因此DXT1的透明其實是一種鏤空,利用網孔達到的透明效果,我們一般對畫面質量要求不高並且不需要透明信息的圖片使用這種格式。

DXT2/DXT3

DXT2和DXT3可以表示具有更復雜的透明信息的貼圖,這兩種格式採用的是顯式的Alpha表示,我們知道了在DXT1中,我們使用64位數據來描述4*4的像素塊的顏色信息,在DXT2和DXT3中,這部分顏色信息是不變的,而是通過另附加64位數據也就是每個像素4位來表示他們的Alpha透明信息,而這4位的Alpha的信息通常情況下我們可以採用直接編碼的方式來表示即可。

這樣每個4×4像素塊佔用128位也就是8個字,0~3字表示透明信息;4~7表示前面描述的顏色的信息。

DXT2和DXT3的不同之處在於,DXT2中顏色是已經完成了Premultiplied by alpha操作(已完成顏色與alpha的混合,當透明度發生改變時,直接改變整體顏色值,不必再單獨複合),DXT3的Alpha信息則是相對獨立的,之所以要區分開了則是爲了適應不同的需要,因爲有些場合需要獨立的Alpha信息。 
這裏寫圖片描述

DXT2/DXT3主要用於Alpha通道較銳利,對比強烈的材質,比如鏤空或部分半透材質等。

DXT4/DXT5

DXT4、DXT5也是用於表示具有複雜的透明信息的貼圖,與2和3不同的是4和5的Alpha信息是通過線性插值計算所得,類似於DXT1的顏色信息。同樣的,每4×4的像素塊的透明信息佔用64位,所不同的是,64位中採用了2個8位的alpha值和16個3位的索引值,既然每個像素的索引佔3位,那麼可以表示8種不同的透明狀態。

在這裏插值的方法有兩種,一種用於表示具有完全透明和完全不透明的狀態,另一種則是僅在給出的極端值alpha_0和alpha_1中進行插值。區分的方法也是通過比較alpha_0和alpha_1的大小來實現的,如果alpha_0大於alpha_1,則通過插值計算剩下的6箇中間alpha值;否則,只通過插值計算4箇中間alpha值,alpha_6直接賦值0,alpha_7直接賦值255。

DXT4和DXT5的區別同DXT2和DXT3的區別相同,DXT4的顏色值是理解爲已經完成Premultiplied by alpha操作的。

FOURCC Description Alpha premultiplied? Compression ratio Texture Type
DXT1 1-bit Alpha/Opaque N/A 6:1(對24位源圖) Simple non-alpha
DXT2 Explicit alpha Yes 4:1 Sharp alpha
DXT3 Explicit alpha No 4:1 Sharp alpha
DXT4 Interpolated alpha Yes 4:1 Gradient alpha
DXT5 Interpolated alpha No 4:1 Gradient alpha

ETC紋理壓縮格式

Ericsson Texture Compression,是由 Khronos 支持的開放標準,在移動平臺中廣泛採用。它是一種爲感知質量設計的有損算法,其依據是人眼對亮度改變的反應要高於色度改變。類似於DXT,ETC也是把4x4的像素塊壓縮成一個64或128位的數據塊,也是有損壓縮。

ETC1

ETC1把一個4x4的像素單元組壓成一個64位的數據塊。4x4的像素組先被水平或垂直分割成2個4x2的組,每一半組有1個基礎顏色(分別是RGB444/RGB444或RGB555/RGB333格式)、1個4位的亮度索引、8個2位像素索引。每個像素的顏色等於基礎顏色加上索引指向的亮度範圍。

比如對於某一個半組: 
1. 12位的基礎顏色是RGB(0, 34, 255); 
2. 4位的亮度索引從亮度表中選擇亮度補充,亮度表有16個,下表是0-7,8-15是0-7的2倍。 
這裏寫圖片描述 
亮度索引1對應(-12, -4, 4, 12); 
3. 2位的像素索引是0,所以亮度補充是-12。由此可以得到此像素的顏色值是(0-12, 34-12, 255-12),也即(0, 22, 243)。

四大移動設備GPU都支持ETC1,所以在各種Android設備上非透明紋理都可以採用ETC1格式,遺憾的是ETC1不支持透明。對於透明紋理,在Android設備上,可以把RGB和Alpha拆到2張ETC1紋理上,遊戲中再合成使用。

ETC2

ETC2是ETC1的擴張,向後兼容ETC1,對RGB的壓縮質量更好,並且支持透明通道。目前下列ETC2壓縮格式在OpenGL ES 3.0和OpenGL 4.3上被要求支持: 
- GL_COMPRESSED_RGB8_ETC2 壓縮的RGB888格式,類似於ETC1 
- GL_COMPRESSED_RGBA8_ETC2_EAC 壓縮的RGBA8888格式,支持完全的透明通道 
- GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 壓縮的RGBA數據,只有一位Alpha

ETC2比ETC1壓縮質量更高,而且支持透明,在Android設備上再也不需要打不同紋理格式的包了。不過需要OpenGL ES 3.0以上纔可以,目前很多設備只支持OpenGL ES 2.0。

PVRTC紋理壓縮格式

PowerVR Texture Compression,PVRTC格式與基於塊的壓縮格式,比如S3TC、ETC的不同之處是,它使用2張雙線性放大的低分辨率圖,根據精度和每個像素的權重,融合到一起來呈現紋理,並且2-bpp和4-bpp都支持ARGB數據。PVRTC格式壓縮比高,也是有損壓縮。

PVRTC 2-bpp

2 bits per pixel,每個像素2位,質量較差,把一個8×4的像素單元組壓成一個64位的數據塊。每個數據塊中存儲了6個變量:調製數據(32位),punch-through Alpha標誌(1位),顏色A(15位),顏色A不透明標誌(1位),顏色B(14位)和顏色B的不透明標誌(1位)。

PVRTC 4-bpp

4 bits per pixel,每個像素4位,把一個4×4的像素單元組壓成一個64位的數據塊。每個數據塊中存儲了6個變量:調製數據(32位),調製標誌(1位),顏色B(14位),硬轉換標誌(1位),顏色A(15位)和不透明標誌(1位)。

注意:顏色A和B必須格式相同(都爲RGB或RGBA),並且整個紋理都是這個RGB或RGBA格式。關於PVRTC的詳細細節請參考[7],下面給出一張PVRTC2的格式圖: 
這裏寫圖片描述

PVRTC格式可以用在所有的iOS設備和使用PowerVR GPU的Android設備上,它要求紋理的高、寬必須都是2的整數次冪,最小爲8,並且必須是正方形。

參考:

    1. http://en.wikipedia.org/wiki/S3_Texture_Compression
    2. http://en.wikipedia.org/wiki/Ericsson_Texture_Compression
    3. http://en.wikipedia.org/wiki/PVRTC
    4. http://www.jacobstrom.com/publications/StromAkenineGH05.pdf
    5. http://www.jacobstrom.com/publications/packman_sketch.pdf
    6. http://malideveloper.arm.com/cn/develop-for-mali/sample-code/etcv1-texture-compression-and-alpha-channels/
    7. http://web.onetel.net.uk/~simonnihal/assorted3d/fenney03texcomp.pdf
    8. http://blog.imgtec.com/powervr/pvrtc2-taking-texture-compression-to-a-new-dimension
    9. http://www.cnblogs.com/lancidie/archive/2011/04/27/2031026.html
    10. http://blog.csdn.net/lhc717/article/details/6802951
    11. http://wiki.c3.91.com/index.php?title=手持平臺紋理格式說明
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章