不透明テクスチャと 1 ビット アルファ テクスチャ
不透明テクスチャと 1 ビット アルファ テクスチャ
テクスチャ フォーマット DXT1 は、不透明または単一の透過色のあるテクスチャ用である。
各不透明または 1 ビット アルファ ブロックのために、2 つの 16 ビット値 (RGB 5:6:5 フォーマット) と 1 ピクセル 2 ビットの 4 × 4 ビットマップが格納される。これは、16 テクセルに対して合計 64 ビット、つまり 4 ビット/テクセルとなる。ブロック ビットマップには、4 色間を選択するテクセルごとに 2 ビットがある。4 色のうち 2 色は、符号化されたデータに格納される。他の 2 色は、線形補間で格納される色から派生する。次の図は、このレイアウトを示している。
1 ビット アルファ フォーマットは、ブロックに格納された 16 ビット色値を比較することにより、不透明フォーマットと区別される。これらは、符号なしの整数として処理される。最初の色が次の色よりも大きい場合は、不透明テクセルだけが定義されていることを意味する。つまり、テクセルを表すのに 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 コンポーネントは、ブレンディング前にゼロに設定しておくことを勧める。
8 バイト ブロック用のメモリ層を次の表に示す。最初のインデックスが y 軸、2 番目のインデックスが x 軸に対応すると考える。たとえば、テクセル [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 極値での色) の配置を次に示す。
ビット | カラー |
---|---|
4:0 (LSB*) | 青色成分 |
10:5 | 緑色成分 |
15:11 | 赤色成分 |
*最下位ビット (LSB)
bitmap 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)
bitmap 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 つの補間色を使って、均一に変化するグラデーションを形成する。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 ビット整数 (color_0) が符号なし 16 ビット整数 (color_1) より小さい場合、このフォーマットが選択される。このフォーマットは、青空を背景にした木の葉などに使える。いくつかのテクセルは、3 色の緑の影が葉に対して使われる間に透過型として記される。これら 2 色は極値に適合し、3 番目の色は補間した色となる。
そのような画像の例を次に示す。
上の図で、白色で示す画像では、テクセルは透過型として符号化されることに注意すること。また、透過型テクセルの RGBA コンポーネントは、ブレンディング前にゼロに設定するよう注意すること。
色と透過性に対するビットマップ符号化は、次の計算式を使用して決定される。
00 ? color_0
01 ? color_1
10 ? 1/2 color_0 + 1/2 color_1
11 ? Transparent
ビットマップは、次のようになる。