共用方式為


具有 Alpha 色板的紋理

有兩種方法可用來編碼紋理對應,以營造更複雜的透明度。 在每個案例中,已描述的 64 位元區塊前方會存在描述透明度的區塊。 透明度會透過兩種方式表示:使用 4x4 點陣圖表示,每一像素 4 位元 (明確編碼),或是具有較少位元和線性插補 (與色彩編碼相似)。

透明度區塊和色彩區塊的配置方式會如下表所示。

文字位址 64 位元區塊
3:0 透明度區塊
7:4 先前描述的 64 位元區塊

明確紋理編碼

針對明確紋理編碼 (BC2 位元),描述透明度的紋理像素 Alpha 元件會使用 4x4 點陣圖編碼,每一像素 4 位元。 這四個位元可透過各種方式達成,例如遞色或使用 Alpha 資料的四個最高有效位元。 但在產生時,它們只會依原樣使用,不會進行任何形式的插補。

下表顯示 64 位元透明度區塊。

64 位透明度區塊的圖表

注意:Direct3D 的壓縮方法會使用四個最高有效位元。

 

下表說明針對每個 16 位元單字,Alpha 資訊在記憶體中採用的配置方式。

單字 0 的配置:

Bits Alpha
3:0 (LSB*) [0][0]
7:4 [0][1]
11:8 [0][2]
15:12 (MSB*) [0][3]

 

*最低有效位元、最高有效位元 (MSB)

單字 1 的配置:

Bits Alpha
3:0 (LSB) [1][0]
7:4 [1][1]
11:8 [1][2]
15:12 (MSB) [1][3]

 

單字 2 的配置:

Bits Alpha
3:0 (LSB) [2][0]
7:4 [2][1]
11:8 [2][2]
15:12 (MSB) [2][3]

 

單字 3 的配置:

Bits Alpha
3:0 (LSB) [3][0]
7:4 [3][1]
11:8 [3][2]
15:12 (MSB) [3][3]

 

BC1 中用來判斷紋理像素是否為透明的色彩比較,並不會使用這個格式。 它會假設在沒有色彩比較之下,色彩資料一律會視為在 4 色模式中。

三位元線性 Alpha 插補

BC3 格式的透明度編碼與色彩所採用的線性編碼概念相似。 區塊的第一個八位元組,會儲存兩個 8 位元 Alpha 值和一個 4x4 點陣圖,每一像素三位元。 代表性的 Alpha 值會用來插補中繼 Alpha 值。 其他資訊會於儲存兩個 Alpha 值的過程中提供。 如果 alpha_0 大於 alpha_1,則插補會建立六個中繼 Alpha 值。 否則,指定的 Alpha 極端值之間將插補四個中繼 Alpha 值。 另外兩個隱含的 Alpha 值為 0 (完全透明) 和 255 (完全不透明)。

下列程式碼範例會說明這個演算法。

// 8-alpha or 6-alpha block?    
if (alpha_0 > alpha_1) {    
    // 8-alpha block:  derive the other six alphas.    
    // Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated.
    alpha_2 = (6 * alpha_0 + 1 * alpha_1 + 3) / 7;    // bit code 010
    alpha_3 = (5 * alpha_0 + 2 * alpha_1 + 3) / 7;    // bit code 011
    alpha_4 = (4 * alpha_0 + 3 * alpha_1 + 3) / 7;    // bit code 100
    alpha_5 = (3 * alpha_0 + 4 * alpha_1 + 3) / 7;    // bit code 101
    alpha_6 = (2 * alpha_0 + 5 * alpha_1 + 3) / 7;    // bit code 110
    alpha_7 = (1 * alpha_0 + 6 * alpha_1 + 3) / 7;    // bit code 111  
}    
else {  
    // 6-alpha block.    
    // Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated.
    alpha_2 = (4 * alpha_0 + 1 * alpha_1 + 2) / 5;    // Bit code 010
    alpha_3 = (3 * alpha_0 + 2 * alpha_1 + 2) / 5;    // Bit code 011
    alpha_4 = (2 * alpha_0 + 3 * alpha_1 + 2) / 5;    // Bit code 100
    alpha_5 = (1 * alpha_0 + 4 * alpha_1 + 2) / 5;    // Bit code 101
    alpha_6 = 0;                                      // Bit code 110
    alpha_7 = 255;                                    // Bit code 111
}

Alpha 區塊的記憶體配置會如下方所示:

Byte Alpha
0 Alpha_0
1 Alpha_1
2 [0][2] (2 個 MSB), [0][1], [0][0]
3 [1][1] (1 個 MSB), [1][0], [0][3], [0][2] (1 LSB)
4 [1][3], [1][2], [1][1] (2 個 LSB)
5 [2][2] (2 個 MSB), [2][1], [2][0]
6 [3][1] (1 個 MSB), [3][0], [2][3], [2][2] (1 LSB)
7 [3][3], [3][2], [3][1] (2 個 LSB)

 

BC1 中用來判斷紋理像素是否為透明的色彩比較,並不會使用這些格式。 它會假設在沒有色彩比較之下,色彩資料一律會視為在 4 色模式中。

壓縮紋理資源