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


Непрозрачные и 1-разрядные альфа-текстуры (Direct3D 9)

Формат текстуры DXT1 предназначен для текстур, которые являются непрозрачными или имеют один прозрачный цвет.

Для каждого непрозрачного или 1-разрядного альфа-блока сохраняются два 16-разрядных значения (формат RGB 5:6:5) и битовая карта 4 x 4 с 2 битами на пиксель. Это в сумме составляет 64 бита для 16 текселей или четыре бита на тексель. В битовой карте блока предусматриваются 2 бита на тексель для выбора из четырех цветов, два из которых хранятся в закодированных данных. Другие два цвета являются производными от эти сохраненных цветов путем линейной интерполяции. Этом макет показан на следующей схеме.

схема битовой карты

Формат 1-разрядного альфа-значения может быть отличен от формата непрозрачного цвета путем сравнения двух 16-разрядных значений цвета, сохраненных в блоке. Они обрабатываются как целые числа без знака. Если первый цвет больше, чем второй, подразумевается, что определены только непрозрачные тексели. Это означает, что для представления текселей используются четыре цвета. В четырехцветном кодировании существует два производных цвета, а все четыре цвета распределяются равномерно в цветовом пространстве RGB. Этот формат аналогичен формату RGB 5:6:5. В противном случае для 1-разрядной альфа-прозрачности используются три цвета, а четвертый резервируется для представления прозрачных текселей.

В кодировке тремя цветами существует один производный цвет, а четвертый 2-разрядный код резервируется для указания прозрачного текселя (данные альфа-канала). Этот формат аналогичен RGBA 5:5:5:1, где заключительный разряд используется для кодирования альфа-маски.

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

if (color_0 > color_1) 
{
    // Four-color block: derive the other two colors.    
    // 00 = color_0, 01 = color_1, 10 = color_2, 11 = color_3
    // These 2-bit codes correspond to the 2-bit fields 
    // stored in the 64-bit block.
    color_2 = (2 * color_0 + color_1 + 1) / 3;
    color_3 = (color_0 + 2 * color_1 + 1) / 3;
}    
else
{ 
    // Three-color block: derive the other color.
    // 00 = color_0,  01 = color_1,  10 = color_2,  
    // 11 = transparent.
    // These 2-bit codes correspond to the 2-bit fields 
    // stored in the 64-bit block. 
    color_2 = (color_0 + color_1) / 2;    
    color_3 = transparent;    

}

Перед наложением рекомендуется установить компоненты RGBA для пикселя прозрачности равными нулю.

В следующих таблицах показана схема памяти для 8-байтового блока. Предполагается, что первый индекс соответствует координате по оси Y, а второй соответствует координате по оси X. Например, Texel[1][2] ссылается на пиксель карты текстуры в (x,y) = (2,1).

Эта таблица содержит макет памяти для 8-байтового (64-разрядного) блока.

Адрес слова 16-разрядное слово
0 Color_0
1 Color_1
2 Точечные Word_0
3 Точечный Word_1

 

Color_0 и Color_1 цвета на двух крайних, выкладываются следующим образом:

Bits Цвет
4:0 (LSB*) Компонент синего цвета
10:5 Компонент зеленого цвета
15:11 Компонент красного цвета

 

*наименьший бит

Растровое изображение Word_0 выкладывается следующим образом:

Bits Тексель
1:0 (LSB) Тексель[0][0]
3:2 Тексель[0][1]
5:4 Тексель[0][2]
7:6 Тексель[0][3]
9:8 Тексель[1][0]
11:10 Тексель[1][1]
13:12 Тексель[1][2]
15:14 (MSB*) Тексель[1][3]

 

*наиболее значимый бит (MSB)

Точечные Word_1 выкладываются следующим образом:

Bits Тексель
1:0 (LSB) Тексель[2][0]
3:2 Тексель[2][1]
5:4 Тексель[2][2]
7:6 Тексель[2][3]
9:8 Тексель[3][0]
11:10 Тексель[3][1]
13:12 Тексель[3][2]
15:14 (MSB) Тексель[3][3]

 

Пример кодировки непрозрачного цвета

В примере кодирования непрозрачного цвета предположим, что красный и черный цвета находятся на разных краях диапазона. Красный — color_0, а черный — color_1. Существует четыре интерполированных цвета, которые образуют равномерно распределенный между ними градиент. Чтобы определить значения для битовой карты 4 x 4, используются следующие расчеты.

00 ? color_0
01 ? color_1
10 ? 2/3 color_0 + 1/3 color_1
11 ? 1/3 color_0 + 2/3 color_1

Битовая карта выглядит согласно следующей схеме.

Схема: развернутый макет растрового рисунка.

Это выглядит как следующий набор цветов на иллюстрации.

Примечание

На изображении пиксель (0,0) отображается в левом верхнем углу.

 

иллюстрация непрозрачного закодированного градиента

Пример 1-битного альфа-кодирования

Этот формат выбирается, если 16-разрядное целое число без знака, color_0, меньше 16-разрядного целого числа без знака color_1. Пример использования этого формата — листья на дереве на фоне голубого неба. Некоторые тексели могут быть отмечены как прозрачные, и в то же время три оттенка зеленого по-прежнему доступны для листьев. Два цвета располагаются по краям, а третий является интерполированным цветом.

Ниже приведена иллюстрация с примером такого рисунка.

иллюстрация кодирования 1-разрядного альфа-значения

Обратите внимание, что если изображение отображается как белое, тексель будет закодирован как прозрачный. Также обратите внимание, что перед смешения компоненты RGBA прозрачных текселей должны иметь нулевое значение.

Кодировка битовой карты для цветов и прозрачности определяется с помощью следующих вычислений.

00 ? color_0
01 ? color_1
10 ? 1/2 color_0 + 1/2 color_1
11   ?   Transparent

Битовая карта выглядит согласно следующей схеме.

схема развернутой битовой карты

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