Поделиться через


Текстуры с альфа-каналами (Direct3D 9)

Существует два способа кодирования карт текстур с более сложной прозрачностью. В каждом случае блок, описывающий прозрачность, предшествует 64-разрядному блоку, который уже был описан. Прозрачность представляется либо в виде точечного рисунка 4x4 с 4 битами на пиксель (явная кодировка) или с меньшим количеством битов и линейной интерполяцией, которая аналогична тому, что используется в кодировании цвета.

Блок прозрачности и цветовой блок упорядочиваются так, как показано в следующей таблице.

Адрес слова 64-разрядный блок
3:0 Блок прозрачности
7:4 Вышеописанный 64-разрядный блок

 

Явное кодирование текстур

Для явного кодирования текстур (форматы DXT2 и DXT3) альфа-компоненты текселей, описывающие прозрачность, кодируются в растровом рисунке 4x4 с 4 битами на тексель. Эти четыре бита можно получить различными способами, например с помощью сглаживания или используя четыре наиболее важных бита данных альфа-канала. Как бы они ни были получены, они используются в текущем виде, без интерполяции в любой форме.

На следующей схеме показан блок 64-разрядной прозрачности.

Диаграмма 64-разрядного блока прозрачности

Примечание

Метод сжатия Direct3D использует четыре наиболее значимых бита.

 

В следующих таблицах показано, как размещены в памяти данные альфа-канала для каждого 16-разрядного слова.

Эта таблица содержит макет для слова 0.

Bits Коэффициент альфа
3:0 (LSB*) [0][0]
7:4 [0] [1]
11:8 [0] [2]
15:12 (MSB*) [0] [3]

 

*наименьший бит, самый значительный бит (MSB)

Эта таблица содержит макет для слова 1.

Bits Коэффициент альфа
3:0 (LSB) [1] [0]
7:4 [1][1]
11:8 [1] [2]
15:12 (MSB) [1] [3]

 

Эта таблица содержит макет для слова 2.

Bits Коэффициент альфа
3:0 (LSB) [2] [0]
7:4 [2] [1]
11:8 [2][2]
15:12 (MSB) [2] [3]

 

Эта таблица содержит макет для word 3.

Bits Коэффициент альфа
3:0 (LSB) [3] [0]
7:4 [3] [1]
11:8 [3] [2]
15:12 (MSB) [3][3]

 

Разница между DXT2 и DXT3 заключается в том, что в формате DXT2 предполагается, что цветовые данные были предварительно изменены альфа-каналом. В формате DXT3 предполагается, что цвет не предварительно задан альфа-каналом. Эти два формата необходимы, так как в большинстве случаев к моменту использования текстуры простого изучения данных недостаточно, чтобы определить, были ли значения цвета умножены на альфа. Так как эти сведения необходимы во время выполнения, для различения этих случаев используются два кода FOURCC. Однако методы интерполяции и данных, используемые для этих двух форматов, идентичны.

Сравнение цветов, используемое в DXT1 для определения прозрачности текселя, не используется в этом формате. Предполагается, что без сравнения цвета цветовые данные всегда обрабатываются в четырехцветном режиме. Другими словами, оператор if в верхней части кода DXT1 должен быть следующим:

if ((color_0 > color_1) OR !DXT1) {

Three-Bit линейная альфа-интерполяция

Кодирование прозрачности для форматов DXT4 и DXT5 основано на концепции, аналогичной линейной кодировке, используемой для цвета. Два 8-разрядных альфа-фактора и точечный рисунок 4x4 с тремя битами на пиксель хранятся в первых восьми байтах блока. Репрезентативные альфа-факторы используются для интерполяции промежуточных альфа-факторов. Дополнительная информация содержится в способе хранения двух альфа-факторов. Если alpha_0 больше alpha_1, интерполяция создает шесть промежуточных альфа-значений. В противном случае четыре промежуточных альфа-фактора интерполируются между указанными крайними альфа-факторами. Два дополнительных неявных альфа-фактора: 0 (полностью прозрачный) и 255 (полностью непрозрачный).

Следующий пример кода иллюстрирует этот алгоритм.

// 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
}

Схема памяти альфа-блока выглядит следующим образом.

Byte Коэффициент альфа
0 Alpha_0
1 Alpha_1
2 [0] [2] (2 MSB), [0][1], [0][0]
3 [1] [1] (1 МСБ), [1][0], [0][3], [0][2] (1 LSB)
4 [1] [3], [1][2], [1][1] (2 LSB)
5 [2] [2] (2 MSB), [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 LSB)

 

Разница между DXT4 и DXT5 заключается в том, что в формате DXT4 предполагается, что цветовые данные были предварительно изменены альфа-каналом. В формате DXT5 предполагается, что цвет не предварительно задан альфа-каналом. Эти два формата необходимы, так как в большинстве случаев к моменту использования текстуры простого изучения данных недостаточно, чтобы определить, были ли значения цвета умножены на альфа. Так как эти сведения необходимы во время выполнения, для различения этих случаев используются два кода FOURCC. Однако методы данных и интерполяции, используемые для этих двух форматов, идентичны.

Сравнение цветов, используемое в DXT1 для определения прозрачности текселя, не используется в этих форматах. Предполагается, что без сравнения цвета цветовые данные всегда обрабатываются в четырехцветном режиме. Другими словами, оператор if в верхней части кода DXT1 должен быть следующим:

if ((color_0 > color_1) OR !DXT1) {

Сжатые ресурсы текстуры