Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Существует два способа кодирования карт текстур, которые демонстрируют более сложную прозрачность. В каждом случае блок, описывающий прозрачность, предшествует 64-разрядному блоку, уже описанному. Прозрачность представляется как 4x4-битовое изображение с 4 битами на пиксель (явная кодировка), или с меньшим количеством битов и линейной интерполяции, аналогичной тому, что используется для кодировки цвета.
Блок прозрачности и цветной блок упорядочены, как показано в следующей таблице.
Адрес Word | 64-разрядный блок |
---|---|
3:0 | Блок прозрачности |
7:4 | Ранее описанный 64-разрядный блок |
Явная кодировка текстур
Для явной кодировки текстур (форматы DXT2 и DXT3) альфа-компоненты текселей, описывающие прозрачность, кодируются в 4x4-битовом рисунке с 4 битами на тексель. Эти четыре бита можно достичь с помощью различных средств, таких как дитерирование или использование четырех наиболее важных битов альфа-данных. Однако они создаются, они используются так же, как они, без какой-либо формы интерполяции.
На следующей схеме показан 64-разрядный блок прозрачности.
Заметка
Метод сжатия Direct3D использует четыре наиболее важных бита.
В следующих таблицах показано, как альфа-информация размещается в памяти для каждого 16-разрядного слова.
Эта таблица содержит макет для word 0.
Биты | Альфа |
---|---|
3:0 (LSB*) | [0][0] |
7:4 | [0][1] |
11:8 | [0][2] |
15:12 (MSB*) | [0][3] |
*наименьший бит, наиболее значительный бит (MSB)
Эта таблица содержит макет для word 1.
Биты | Альфа |
---|---|
3:0 (LSB) | [1][0] |
7:4 | [1][1] |
11:8 | [1][2] |
15:12 (MSB) | [1][3] |
Эта таблица содержит макет для word 2.
Биты | Альфа |
---|---|
3:0 (LSB) | [2][0] |
7:4 | [2][1] |
11:8 | [2][2] |
15:12 (MSB) | [2][3] |
Эта таблица содержит макет слова 3.
Биты | Альфа |
---|---|
3:0 (LSB) | [3][0] |
7:4 | [3][1] |
11:8 | [3][2] |
15:12 (MSB) | [3][3] |
Разница между DXT2 и DXT3 заключается в том, что в формате DXT2 предполагается, что цветовые данные предварительно премулируются альфа-буквой. В формате DXT3 предполагается, что цвет не премулируется альфа-символом. Эти два формата необходимы, так как в большинстве случаев к тому времени, когда используется текстура, просто проверьте данные недостаточно, чтобы определить, умножаются ли значения цвета на альфа. Так как эти сведения необходимы во время выполнения, два кода FOURCC используются для различения этих случаев. Однако метод данных и интерполяции, используемый для этих двух форматов, идентичен.
Сравнение цветов, используемое в DXT1 для определения того, не используется ли тексель в этом формате. Предполагается, что без сравнения цвета данные цвета всегда обрабатываются как если бы в 4-цветовом режиме. Другими словами, оператор 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
}
Макет памяти альфа-блока выглядит следующим образом:
Байт | Альфа |
---|---|
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) |
Разница между DXT4 и DXT5 заключается в том, что в формате DXT4 предполагается, что цветовые данные предварительно премулируются альфа-данными. В формате DXT5 предполагается, что цвет не премультируется альфа-форматом. Эти два формата необходимы, так как в большинстве случаев к тому времени, когда используется текстура, просто проверьте данные недостаточно, чтобы определить, умножаются ли значения цвета на альфа. Так как эти сведения необходимы во время выполнения, два кода FOURCC используются для различения этих случаев. Однако метод данных и интерполяции, используемый для этих двух форматов, идентичен.
Сравнение цветов, используемое в DXT1 для определения того, является ли тексель прозрачным, не используется с этими форматами. Предполагается, что без сравнения цвета данные цвета всегда обрабатываются как если бы в 4-цветовом режиме. Другими словами, оператор if в верхней части кода DXT1 должен быть следующим:
if ((color_0 > color_1) OR !DXT1) {
Связанные разделы