不透明テクスチャと 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 番目の色は補間した色となる。

そのような画像の例を次に示す。

1 ビット アルファの例

上の図で、白色で示す画像では、テクセルは透過型として符号化されることに注意すること。また、透過型テクセルの RGBA コンポーネントは、ブレンディング前にゼロに設定するよう注意すること。

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

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

ビットマップは、次のようになる。

拡張されたビットマップ レイアウト