紋理格式 BC1 適用於不透明或具有單一透明色彩的紋理。
針對每個不透明或 1 位 Alpha 區塊,會儲存兩個 16 位值(RGB 5:6:5 格式),以及每圖元 2 位的 4x4 位陣圖。 這總計為16個紋素的64位,或每個紋素的四個位。 在區塊位圖中,每個 texel 有 2 個位元可用於選擇四種顏色,其中兩種顏色會儲存在編碼數據中。 其他兩種色彩是透過線性插補來衍生自這些預存色彩。 下圖顯示此版面配置。
1 位 Alpha 格式會藉由比較區塊中儲存的兩個 16 位色彩值,來區別不透明格式。 它們會被視為不帶正負號的整數。 如果第一個色彩大於第二個色彩,則表示只會定義不透明的紋素。 這表示使用四種色彩來代表紋素。 在四色編碼中,有兩種衍生色彩,而且所有四種色彩都會平均分散在 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 | 顏色_0 |
| 1 | 顏色_1 |
| 2 | 位圖Word_0 |
| 3 | 位圖 Word_1 |
Color_0和Color_1,兩個極端的色彩,配置如下:
| 位元 | 顏色 |
|---|---|
| 4:0 (LSB*) | 藍色元件 |
| 10:5 | 綠色色彩成分 |
| 15:11 | 紅色元件 |
*最小有效位
點陣圖Word_0配置如下:
| 位元 | 紋素 |
|---|---|
| 1:0 (LSB) | 紋素[0][0] |
| 3:2 | 紋素[0][1] |
| 5:4 | 紋素[0][2] |
| 7:6 | 紋素[0][3] |
| 9:8 | 紋素[1][0] |
| 11:10 | 紋素[1][1] |
| 13:12 | 紋素[1][2] |
| 15:14 (MSB*) | 紋素[1][3] |
*最重要的位元(MSB)
點陣圖「Word_1」的配置如下:
| 位元 | 紋素 |
|---|---|
| 1:0 (LSB) | 紋素[2][0] |
| 3:2 | 紋素[2][1] |
| 5:4 | 紋素[2][2] |
| 7:6 | 紋素[2][3] |
| 9:8 | 紋素[3][0] |
| 11:10 | 紋素[3][1] |
| 13:12 | 紋素[3][2] |
| 15:14 (MSB) | 紋素[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
然後,點陣圖看起來像下圖。
相關主題