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 de 4 x 4 com 4 bits por pixel (codificação explícita), ou com menos bits e interpolação linear parecida com a que é usada para a 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 da palavra | 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 alcançados por uma variedade de meios, como pontilhado ou usando os quatro bits mais significativos dos dados alfa. Independentemente de como são produzidos, eles são usados como estão, sem qualquer forma de interpolação.
O diagrama a seguir mostra um bloco de transparência de 64 bits.
Observação
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 | Alpha |
---|---|
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 | Alpha |
---|---|
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 | Alpha |
---|---|
3:0 (LSB) | [2] [0] |
7:4 | [2] [1] |
11:8 | [2][2] |
15:12 (MSB) | [2] [3] |
Esta tabela contém o layout da palavra 3.
Bits | Alpha |
---|---|
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, o método de interpolação e dados usados para esses dois formatos é idêntico.
A comparação de cores usada no DXT1 para determinar se o texel é transparente não é usada nesse formato. Presume-se que, sem a comparação de cores, os dados de cor sejam sempre tratados como se estivessem 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 de 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 os valores alfa intermediários. Há mais informações disponíveis sobre 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, os 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 da memória do bloco de alfa é o seguinte:
Byte | Alpha |
---|---|
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, o método de interpolação e dados usados para esses dois formatos é idêntico.
A comparação de cores usada no DXT1 para determinar se o texel é transparente não é usada com esses formatos. Presume-se que, sem a comparação de cores, os dados de cor sejam sempre tratados como se estivessem 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