不透明和 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,就會選取這個格式。 這個格式的使用範例之一,就是在藍天映襯下的綠色樹葉。 有些紋理像素可標示為透明,而三個綠色陰影仍可用於樹葉上。 兩種色彩會修正極端值,而第三種色彩則為插補色彩。
下圖顯示這類圖片的範例。
雖然影像顯示為白色,紋理像素則會編碼為透明。 透明紋理像素的 RGBA 元件應於混合前設為零。
色彩和透明度的點陣圖編碼會使用下列計算來判斷。
00 ? color_0
01 ? color_1
10 ? 1/2 color_0 + 1/2 color_1
11 ? Transparent
隨後,點陣圖就會如下圖所示。
相關主題