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

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

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

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

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

Для явного кодирования текстур (формат BC2) альфа-компоненты текселей, которые описывают прозрачность, кодируются в точечный рисунок размером 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]

 

Структура для слова 3:

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

 

Сравнение цвета, используемое в BC1 для определения прозрачности текселя, в данном формате не используется. Предполагается, что без сравнения цвета цветовые данные всегда обрабатываются в четырехцветном режиме.

Линейная трехразрядная интерполяция альфа-канала

Кодирование прозрачности для формата BC3 основано на концепции, аналогичной линейному кодированию, используемому для цвета. Два 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 MSB), [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)

 

Сравнение цвета, используемое в BC1 для определения прозрачности текселя, в данных форматах не используется. Предполагается, что без сравнения цвета цветовые данные всегда обрабатываются в четырехцветном режиме.

Ресурсы сжатых текстур