Platform SDK: DirectX

不透明と 1 ビット アルファ テクスチャ

テクスチャ フォーマット DXT1 は、不透明または単一の透過型色のあるテクスチャ用である。

各不透明または 1 ビット アルファ ブロックのために、2 つの 16 ビット値 (RGB 5:6:5 フォーマット) とピクセルごとに 2 ビットの 4 × 4 ビットマップが格納される。これは、16 テクセルまたは 4 ビット/テクセルに対して合計 64 ビットとなる。ブロック ビットマップには、4 色間を選択するテクセルごとに 2 ビットがある。4 色のうち 2 色は、符号化されたデータに格納される。他の 2 色は、線形補間で格納される色から派生する。

1 ビット アルファ フォーマットは、ブロックに格納される 16 ビットカラー値を比較することにより、不透明フォーマットと区別される。これらは、符号なしの整数として処理される。最初の色が次の色よりも大きい場合は、不透明テクセルだけが定義されていることを意味する。これは、4 色がテクセルを現すために使用されることを意味する。4 色の符号化には 2 つの派生した色があり、全 4 色は RGB 色空間に等しく配布される。このフォーマットは、RGB 5:6:5 フォーマットに類似している。他の点では、1 ビット アルファ透過性用にこれらの色は使用され、4 番目の色は透過型テクセルを現すために確保される。

3 つの色の符号化には 1 つの派生した色があり、4 番目の 2 ビット コードは透過型テクセル (アルファ情報) を含むために確保される。このフォーマットは、アルファ マスクを符号化するために使用される最後のビットのある RGBA 5:5:5:1 に類似している。

[C++]

次に示す類似コードの一部で、3 または 4 色符号化が選択されるかどうかを決定するためのアルゴリズムを説明する。

if (color_0 > color_1) 
{
// 4 色ブロック :他の 2 色を派生する。
// 00 = 色 0_, 01 = 色 1, 10 = 色 2, 11 = 色 3
// 64 ビット ブロックに確保される
// 2 ビットフィールドに対応する 2 ビット コード。
     color_2 = (2 * color_0 + color_1) / 3;
     color_3 = (color 0 + 2 * color_1) / 3;
}    
else
{ 
// 3 色ブロック :他の色を派生する。
// 00 = 色 0, 01 = 色 1, 10 = 色 2,
// 11 = 透過型。
// 64 ビット ブロックに確保される
// 2 ビットフィールドに対応する 2 ビット コード。
color_2 = (color_0 + color_1) / 2;
color_3 = transparent;
}

8 バイト ブロック用のメモリ層を次の表で示す。最初のインデックスが y 軸、2 番目のインデックスが x 軸に対応すると考える。たとえば、テクセル [1][2] は (x,y) = (2,1) でテクスチャ マップ ピクセルを参照する。

8 バイト (64 ビット) ブロック用のメモリ層

単語アドレス 16 ビット単語
0 色 _0
1 色 _1
2 ビットマップ単語 _0
3 ビットマップ単語 _1

色 0 と色 1 (2 極値での色) の配置

ビット
04:00 (LSB) 青色成分
10:5 緑色成分
15:11 赤色成分

ビットマップ word_0 の配置

ビット テクセル
01:00 (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]

ビットマップ word_1 の配置

ビット テクセル
01:00 (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]

不透明色符号の例

不透明符号の例として、赤と黒が極値であると仮定する。赤色 _0 および黒色 _1 とする。一様に傾度を互いに分割したフォームの補間した 4 色がある。4 × 4 ビットマップの値を決定するには、次に示す計算式を使用する。

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

1 ビット アルファ符号の例

符号なし 16 ビット整数 (色 _0) が符号なし 16 ビット整数 (色 _1) より小さい場合、このフォーマットが選択される。このフォーマットの使用例としては、青空に対して示される木の葉である。いくつかのテクセルは、3 色の緑の影が葉に対して使用される間に透過型として記される。これらの色の 2 色は極値に適合し、3 番目の色は補間した色となる。

色と透過性に対するビットマップ符号は、次の計算式を使用して決定される。

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

[C++,Visual Basic]