テクスチャ形式 BC1 は、不透明なテクスチャまたは単一の透明な色を持つテクスチャを対象とします。
不透明または 1 ビットのアルファ ブロックごとに、2 つの 16 ビット値 (RGB 5:6:5 形式) と 4 x 4 ビットマップ (ピクセルあたり 2 ビット) が格納されます。 16 テクセルの場合は合計 64 ビット、テクセルあたり 4 ビットです。 ブロック ビットマップでは、テクセルごとに 2 ビットがあり、4 つの色から選択できます。そのうちの 2 つはエンコードされたデータに格納されます。 他の 2 つの色は、線形補間によって、これらの格納された色から派生します。 このレイアウトを次の図に示します。
ビットマップ レイアウト の
1 ビットのアルファ形式は、ブロックに格納されている 2 つの 16 ビットカラー値を比較することで、不透明な形式と区別されます。 これらは符号なし整数として扱われます。 最初の色が 2 番目の色より大きい場合は、不透明なテクセルのみが定義されていることを意味します。 つまり、テクセルを表すために 4 つの色が使用されます。 4 色エンコードでは、2 つの派生色があり、4 つの色はすべて RGB 色空間に均等に分散されます。 この形式は RGB 5:6:5 形式に似ています。 それ以外の場合、1 ビットのアルファ透明度では、3 つの色が使用され、4 番目の色は透明なテクセルを表すために予約されます。
3 色エンコードでは、1 つの派生色があり、4 番目の 2 ビット コードは透明なテクセル (アルファ情報) を示すために予約されています。 この形式は RGBA 5:5:5:1 に似ています。最後のビットはアルファ マスクのエンコードに使用されます。
次のコード例は、3 色エンコードと 4 色エンコードのどちらを選択するかを決定するためのアルゴリズムを示しています。
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 コンポーネントを 0 に設定することをお勧めします。
次の表は、8 バイト ブロックのメモリ レイアウトを示しています。 最初のインデックスは y 座標に対応し、2 番目のインデックスは x 座標に対応すると仮定します。 たとえば、テクセル[1][2]は、(x,y) = (2,1) のテクスチャ マップ ピクセルを参照します。
8 バイト (64 ビット) ブロックのメモリ レイアウトを次に示します。
Word アドレス | 16 ビット ワード |
---|---|
0 | カラー_0 |
1 | カラー_1 |
2 | ビットマップ Word_0 |
3 | ビットマップ Word_1 |
Color_0とColor_1、2 つの極端な色は次のようにレイアウトされています。
ビット | 色 |
---|---|
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。 それらの間に均一に分散されたグラデーションを形成する 4 つの補間された色があります。 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 ビット アルファ エンコードの例
この形式は、符号なし 16 ビット整数 color_0 が符号なし 16 ビット整数 color_1 より小さい場合に選択されます。 この形式を使用できる例は、青い空に対して表示される、ツリー上の葉です。 一部のテクセルは透明にすることが可能で、葉には依然として3つの緑のトーンが利用可能です。 2 色は極端な色を修正し、3 番目の色は補間された色です。
次の図は、このような図の例です。
1 ビット アルファ エンコード の
イメージが白で表示されている場合、テクセルは透明としてエンコードされます。 ブレンドする前に、透明テクセルの RGBA コンポーネントを 0 に設定する必要があります。
色と透明度のビットマップ エンコードは、次の計算を使用して決定されます。
00 ? color_0
01 ? color_1
10 ? 1/2 color_0 + 1/2 color_1
11 ? Transparent
その後、ビットマップは次の図のようになります。
関連トピック