共用方式為


不透明和 1 位元 Alpha 紋理

紋理格式 BC1 適用於不透明或具採用單一透明色彩的紋理。

每個不透明和 1 位元 Alpha 區塊,都會儲存兩個 16 位元值 (RGB 5:6:5 格式),以及每像素 2 位元的 4x4 點陣圖。 加起來為 16 紋理像素 64 位元,或每個紋理像素四位元。 在區塊點陣圖中,每個紋理像素會有 2 位元可從四種色彩中進行選擇,其中兩種色彩會儲存在編碼資料中。 另外兩種色彩則會透過線性插補的方式,從這些儲存的色彩衍生。 下圖會顯示這個配置。

點陣圖配置圖表

系統會透過比較儲存在區塊中的兩個 16 位元色彩值,以區分 1 位元 Alpha 格式和不透明格式。 它們會視為不帶正負號的整數。 如果第一種色彩大於第二種色彩,即表示只會定義不透明紋理像素。 這意味著,紋理像素會使用四種色彩加以表示。 四色編碼中會有兩種衍生色彩,而四種色彩全都會平均分佈在 RGB 色彩空間中。 這個格式會與 RGB 5:6:5 格式相似。 否則,1 位元 Alpha 透明度將使用三種色彩,並將第四種色彩保留給透明紋理像素。

三色編碼中會有一種衍生色彩,而第四個 2 位元程式碼則會予以保留,以用來表示透明紋理像素 (Alpha 資訊)。 這個格式會與 RGBA 5:5:5:1 相似,當中的最後一個位元會用於編碼 Alpha 遮罩。

下列程式碼範例會說明用來決定應選取三色或四色編碼的演算法:

if (color_0 > color_1) 
{
    // Four-color block: derive the other two colors. 
    
    // 00 = color_0, 01 = color_1, 10 = color_2, 11 = color_3
    // These 2-bit codes correspond to the 2-bit fields 
    // stored in the 64-bit block.
    color_2 = (2 * color_0 + color_1 + 1) / 3;
    color_3 = (color_0 + 2 * color_1 + 1) / 3;
}    
else
{ 
    // Three-color block: derive the other color.
    // 00 = color_0,  01 = color_1,  10 = color_2,  
    // 11 = transparent.
    // These 2-bit codes correspond to the 2-bit fields 
    // stored in the 64-bit block. 
    color_2 = (color_0 + color_1) / 2;    
    color_3 = transparent;    

}

建議在混合之前,將透明度像素的 RGBA 元件設為零。

下表顯示 8 位元組區塊的記憶體配置。 假設第一個索引會對應至 y 座標,而第二個索引則對應至 x 座標。 舉例來說,Texel[1][2] 代表位於 (x,y) = (2,1) 的紋理對應像素。

8 位元組 (64 位元) 區塊的記憶體配置會如下所示:

文字位址 16 位元文字
0 Color_0
1 Color_1
2 Bitmap Word_0
3 Bitmap Word_1

 

Color_0 和 Color_1 為位於兩個極端的色彩,且採用以下配置:

Bits Color
4:0 (LSB*) 藍色元件
10:5 綠色元件
15:11 紅色元件

 

*最低有效位元

Bitmap Word_0 的配置會如下所示:

Bits 紋理像素
1:0 (LSB) Texel[0][0]
3:2 Texel[0][1]
5:4 Texel[0][2]
7:6 Texel[0][3]
9:8 Texel[1][0]
11:10 Texel[1][1]
13:12 Texel[1][2]
15:14 (MSB*) Texel[1][3]

 

*最高有效位元 (MSB)

Bitmap Word_1 的配置會如下所示:

Bits 紋理像素
1:0 (LSB) Texel[2][0]
3:2 Texel[2][1]
5:4 Texel[2][2]
7:6 Texel[2][3]
9:8 Texel[3][0]
11:10 Texel[3][1]
13:12 Texel[3][2]
15:14 (MSB) Texel[3][3]

 

不透明色編碼的範例

以不透明色編碼為例,假設兩個極端分別為紅色和黑色。 紅色為 color_0,而黑色為 color_1。 它們之間會使用四種插補色彩來形成均勻分佈的漸層。 若要判斷 4x4 點陣圖的值,就會使用下列計算:

00 ? color_0
01 ? color_1
10 ? 2/3 color_0 + 1/3 color_1
11 ? 1/3 color_0 + 2/3 color_1

隨後,點陣圖就會如下圖所示。

紅色和黑色展開的點陣圖配置圖表。

這看起來就像下方顯示的一系列色彩。

注意:影像中的 (0,0) 會出現在左上方。

 

不透明編碼漸層的圖例

1 位元 Alpha 編碼的範例

如果不帶正負號的 16 位元整數 color_0 小於不帶正負號的 16 位元整數 color_1,就會選取這個格式。 這個格式的使用範例之一,就是在藍天映襯下的綠色樹葉。 有些紋理像素可標示為透明,而三個綠色陰影仍可用於樹葉上。 兩種色彩會修正極端值,而第三種色彩則為插補色彩。

下圖顯示這類圖片的範例。

1 位 Alpha 編碼的圖例

雖然影像顯示為白色,紋理像素則會編碼為透明。 透明紋理像素的 RGBA 元件應於混合前設為零。

色彩和透明度的點陣圖編碼會使用下列計算來判斷。

00 ? color_0
01 ? color_1
10 ? 1/2 color_0 + 1/2 color_1
11   ?   Transparent

隨後,點陣圖就會如下圖所示。

較淺綠色和較深綠色的展開位圖配置圖表。

壓縮紋理資源