Platform SDK: DirectX |
より複雑な透過性を示すテクスチャ マップの符号化には、2 通りの方法がある。どちらの場合も、透過性を記述するブロックは既に記述されている 64 ビット ブロックより先に起こる。透過性はピクセルごとに 4 ビットの 4 × 4 ビットマップ (明示的な符号化)、またはそれ以下のビットのビットマップのどちらかであり、線形補間は色符号化で使用されることと類似する。
透過性ブロックと色ブロックの配置
単語アドレス | 64 ビット ブロック |
---|---|
3:0 | 透過性ブロック |
7:4 | 既に記述された 64 ビット ブロック |
明示的なテクスチャ符号化
明示的なテクスチャ符号化 (DXT2 と DXT3 フォーマット) のために、透過性を記述するテクセルのアルファ コンポーネントは、テクセルごとに 4 ビットの 4 × 4 ビットマップで符号化される。これらの 4 ビットは、アルファ データで一番重要な 4 つのビットのディザリングや単なる使用などのさまざまな方法で達成できる。ただし、作成されると、あらゆる補間のフォームがないとそれだけでしか使用できない。
注 : DirectDraw の圧縮メソッドは、4 つの最上位ビットを使用する。
次に示す表は、アルファ情報が各 16 ビット単語用に配置される方法について示する。
単語 0 用の配置
ビット | アルファ |
---|---|
3:0 (LSB) | [0][0] |
7:4 | [0][1] |
11:8 | [0][2] |
15:12 (MSB) | [0][3] |
単語 1 用の配置
ビット | アルファ |
---|---|
3:0 (LSB) | [1][0] |
7:4 | [1][1] |
11:8 | [1][2] |
15:12 (MSB) | [1][3] |
単語 2 用の配置
ビット | アルファ |
---|---|
3:0 (LSB) | [2][0] |
7:4 | [2][1] |
11:8 | [2][2] |
15:12 (MSB) | [2][3] |
単語 3 用の配置
ビット | アルファ |
---|---|
3:0 (LSB) | [3][0] |
7:4 | [3][1] |
11:8 | [3][2] |
15:12 (MSB) | [3][3] |
3 ビット線形アルファ補間
DXT4 および DXT5 フォーマットに対する透過性の符号は、色に使用される線形符号と類似する概念が基となる。2 つの 8 ビット アルファ値とピクセルごとに 3 ビットの 4 × 4 ビットマップは、ブロックの最初の 8 バイトに格納される。典型的なアルファ値は、中間アルファ値を補間するために使用される。追加情報は、2 つのアルファ値を格納する方法で利用できる。アルファ _0 がアルファ _1 より大きい場合、6 つの中間アルファ値が補間により作成される。また、4 つの中間アルファ値が指定されるアルファ極値間で補間される。2 つの追加の明示的なアルファ値は、0 (完全に透過型) と 255 (完全に不透明) となる。
次の類似コードでこのアルゴリズムを示す。
// 8 アルファまたは 6 アルファ ブロック? if (alpha_0 > alpha_1) { // 8 アルファ ブロック : 他の 6 つのアルファを派生する。 // 000 = アルファ 0, 001 = アルファ 1, その他は補間される。 alpha_2 = (6 * alpha_0 + alpha_1) / 7; // ビット コード 010 alpha_3 = (5 * alpha_0 + 2 * alpha_1) / 7; // ビット コード 011 alpha_4 = (4 * alpha_0 + 3 * alpha_1) / 7; // ビット コード 100 alpha_5 = (3 * alpha_0 + 4 * alpha_1) / 7; // ビット コード 101 alpha_6 = (2 * alpha_0 + 5 * alpha_1) / 7; // ビット コード 110 alpha_7 = (alpha_0 + 6 * alpha_1) / 7; // ビット コード 111 } else { // 6 アルファ ブロック : 他のアルファを派生する。 // 000 = アルファ 0, 001 = アルファ 1, その他は補間される。 alpha_2 = (4 * alpha_0 + alpha_1) / 5; // ビット コード 010 alpha_3 = (3 * alpha_0 + 2 * alpha_1) / 5; // ビット コード 011 alpha_4 = (2 * alpha_0 + 3 * alpha_1) / 5; // ビット コード 100 alpha_5 = (alpha_0 + 4 * alpha_1) / 5; // ビット コード 101 alpha_6 = 0; // ビット コード 110 alpha_7 = 255; // ビット コード 111 }
アルファ ブロックのメモリ層を次に示す。
バイト | アルファ |
---|---|
0 | アルファ _0 |
1 | アルファ _1 |
2 | [0][2] (2 LSBs) , [0][1], [0][0] |
3 | [1][1] (1 LSB) , [1][0], [0][3], [0][2] (1 MSB) |
4 | [1][3], [1][2], [1][1] (2 MSBs) |
5 | [2][2] (2 LSBs) , [2][1], [2][0] |
6 | [3][1] (1 LSB) , [3][0], [2][3], [2][2] (1 MSB) |
7 | [3][3], [3][2], [3][1] (2 MSBs) |
[C++,Visual Basic]