Texturas com canais alfa (Direct3D 9)
Há duas maneiras de codificar mapas de textura que exibem transparência mais complexa. Em cada caso, um bloco que descreve a transparência precede o bloco de 64 bits já descrito. A transparência é representada como um bitmap 4x4 com 4 bits por pixel (codificação explícita) ou com menos bits e interpolação linear análoga ao que é usado para codificação de cores.
O bloco de transparência e o bloco de cores são organizados conforme mostrado na tabela a seguir.
Endereço do Word | Bloco de 64 bits |
---|---|
3:0 | Bloco de transparência |
7:4 | Bloco de 64 bits descrito anteriormente |
Codificação de textura explícita
Para codificação de textura explícita (formatos DXT2 e DXT3), os componentes alfa dos texels que descrevem a transparência são codificados em um bitmap 4x4 com 4 bits por texel. Esses quatro bits podem ser obtidos por meio de uma variedade de meios, como dithering ou usando os quatro bits mais significativos dos dados alfa. No entanto, eles são produzidos, eles são usados exatamente como são, sem qualquer forma de interpolação.
O diagrama a seguir mostra um bloco de transparência de 64 bits.
Nota
O método de compactação do Direct3D usa os quatro bits mais significativos.
As tabelas a seguir ilustram como as informações alfa são dispostas na memória para cada palavra de 16 bits.
Esta tabela contém o layout do Word 0.
Bits | Alfa |
---|---|
3:0 (LSB*) | [0][0] |
7:4 | [0][1] |
11:8 | [0][2] |
15:12 (MSB*) | [0][3] |
*bit menos significativo, bit mais significativo (MSB)
Esta tabela contém o layout da palavra 1.
Bits | Alfa |
---|---|
3:0 (LSB) | [1][0] |
7:4 | [1][1] |
11:8 | [1][2] |
15:12 (MSB) | [1][3] |
Esta tabela contém o layout do Word 2.
Bits | Alfa |
---|---|
3:0 (LSB) | [2][0] |
7:4 | [2][1] |
11:8 | [2][2] |
15:12 (MSB) | [2][3] |
Esta tabela contém o layout do Word 3.
Bits | Alfa |
---|---|
3:0 (LSB) | [3][0] |
7:4 | [3][1] |
11:8 | [3][2] |
15:12 (MSB) | [3][3] |
A diferença entre DXT2 e DXT3 é que, no formato DXT2, supõe-se que os dados de cor foram pré-multiplicados por alfa. No formato DXT3, supõe-se que a cor não seja pré-multiplicada por alfa. Esses dois formatos são necessários porque, na maioria dos casos, quando uma textura é usada, apenas examinar os dados não é suficiente para determinar se os valores de cor foram multiplicados por alfa. Como essas informações são necessárias em tempo de execução, os dois códigos FOURCC são usados para diferenciar esses casos. No entanto, os dados e o método de interpolação usados para esses dois formatos são idênticos.
A comparação de cores usada no DXT1 para determinar se o texel é transparente não é usada nesse formato. Supõe-se que sem a cor comparar os dados de cor é sempre tratado como se estivesse no modo de 4 cores. Em outras palavras, a instrução if na parte superior do código DXT1 deve ser a seguinte:
if ((color_0 > color_1) OR !DXT1) {
Interpolação Alfa Linear Three-Bit
A codificação da transparência para os formatos DXT4 e DXT5 baseia-se em um conceito semelhante à codificação linear usada para cor. Dois valores alfa de 8 bits e um bitmap 4x4 com três bits por pixel são armazenados nos primeiros oito bytes do bloco. Os valores alfa representativos são usados para interpolar valores alfa intermediários. Informações adicionais estão disponíveis na maneira como os dois valores alfa são armazenados. Se alpha_0 for maior que alpha_1, seis valores alfa intermediários serão criados pela interpolação. Caso contrário, quatro valores alfa intermediários são interpolados entre os extremos alfa especificados. Os dois valores alfa implícitos adicionais são 0 (totalmente transparente) e 255 (totalmente opaco).
O exemplo de código a seguir ilustra esse algoritmo.
// 8-alpha or 6-alpha block?
if (alpha_0 > alpha_1) {
// 8-alpha block: derive the other six alphas.
// Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated.
alpha_2 = (6 * alpha_0 + 1 * alpha_1 + 3) / 7; // bit code 010
alpha_3 = (5 * alpha_0 + 2 * alpha_1 + 3) / 7; // bit code 011
alpha_4 = (4 * alpha_0 + 3 * alpha_1 + 3) / 7; // bit code 100
alpha_5 = (3 * alpha_0 + 4 * alpha_1 + 3) / 7; // bit code 101
alpha_6 = (2 * alpha_0 + 5 * alpha_1 + 3) / 7; // bit code 110
alpha_7 = (1 * alpha_0 + 6 * alpha_1 + 3) / 7; // bit code 111
}
else {
// 6-alpha block.
// Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated.
alpha_2 = (4 * alpha_0 + 1 * alpha_1 + 2) / 5; // Bit code 010
alpha_3 = (3 * alpha_0 + 2 * alpha_1 + 2) / 5; // Bit code 011
alpha_4 = (2 * alpha_0 + 3 * alpha_1 + 2) / 5; // Bit code 100
alpha_5 = (1 * alpha_0 + 4 * alpha_1 + 2) / 5; // Bit code 101
alpha_6 = 0; // Bit code 110
alpha_7 = 255; // Bit code 111
}
O layout de memória do bloco alfa é o seguinte:
Byte | Alfa |
---|---|
0 | Alpha_0 |
1 | Alpha_1 |
2 | [0][2] (2 MSBs), [0][1], [0][0] |
3 | [1][1] (1 MSB), [1][0], [0][3], [0][2] (1 LSB) |
4 | [1][3], [1][2], [1][1] (2 LSBs) |
5 | [2][2] (2 MSBs), [2][1], [2][0] |
6 | [3][1] (1 MSB), [3][0], [2][3], [2][2] (1 LSB) |
7 | [3][3], [3][2], [3][1] (2 LSBs) |
A diferença entre DXT4 e DXT5 é que, no formato DXT4, supõe-se que os dados de cor foram pré-multiplicados por alfa. No formato DXT5, supõe-se que a cor não seja pré-multiplicada por alfa. Esses dois formatos são necessários porque, na maioria dos casos, quando uma textura é usada, apenas examinar os dados não é suficiente para determinar se os valores de cor foram multiplicados por alfa. Como essas informações são necessárias em tempo de execução, os dois códigos FOURCC são usados para diferenciar esses casos. No entanto, os dados e o método de interpolação usados para esses dois formatos são idênticos.
A comparação de cores usada no DXT1 para determinar se o texel é transparente não é usada com esses formatos. Supõe-se que sem a cor comparar os dados de cor é sempre tratado como se estivesse no modo de 4 cores. Em outras palavras, a instrução if na parte superior do código DXT1 deve ser:
if ((color_0 > color_1) OR !DXT1) {
Tópicos relacionados