Текстуры с альфа-каналами
Существует два способа кодирования карт текстур с более сложной прозрачностью. В каждом случае блок, описывающий прозрачность, предшествует 64-разрядному блоку, который уже был описан. Прозрачность представляется либо в виде точечного рисунка 4x4 с 4 битами на пиксель (явная кодировка) или с меньшим количеством битов и линейной интерполяцией, которая аналогична тому, что используется в кодировании цвета.
Блок прозрачности и цветовой блок упорядочиваются так, как показано в следующей таблице.
Адрес слова | 64-разрядный блок |
---|---|
3:0 | Блок прозрачности |
7:4 | Вышеописанный 64-разрядный блок |
Явное кодирование текстур
Для явного кодирования текстур (формат BC2) альфа-компоненты текселей, которые описывают прозрачность, кодируются в точечный рисунок размером 4x4 пикселя, 4 бита на пиксель. Эти четыре бита можно получить различными способами, например с помощью сглаживания или используя четыре наиболее важных бита данных альфа-канала. Как бы они ни были получены, они используются в текущем виде, без интерполяции в любой форме.
На следующей схеме показан блок 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 для определения прозрачности текселя, в данных форматах не используется. Предполагается, что без сравнения цвета цветовые данные всегда обрабатываются в четырехцветном режиме.
Связанные темы
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по