不透明および 1 ビットのアルファ テクスチャ
テクスチャ形式 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 座標に対応すると仮定します。 たとえば、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 (2 つの極端な色) は、次のようなレイアウトになります。
Bits | 色 |
---|---|
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 です。 それらの間に均一に分散されたグラデーションを形成する 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 番目の色は補間された色です。
次の図は、このような図の例です。
イメージが白で表示されている場合、テクセルは透明としてエンコードされます。 ブレンドする前に、透明テクセルの RGBA コンポーネントを 0 に設定する必要があります。
色と透明度のビットマップ エンコードは、次の計算を使用して決定されます。
00 ? color_0
01 ? color_1
10 ? 1/2 color_0 + 1/2 color_1
11 ? Transparent
その後、ビットマップは次の図のようになります。
関連トピック