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


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

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

Для каждого непрозрачного или 1-разрядного альфа-блока хранятся два 16-разрядных значения (RGB 5:6:5) и 4x4-битовое изображение с 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-разрядная версия):

Адрес Word 16-разрядное слово
0 Color_0
1 Color_1
2 Word_0 растрового изображения
3 Растровое изображение Word_1

 

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

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

 

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

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

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

 

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

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

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

 

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

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

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-разрядной альфа-кодировки

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

На следующем рисунке показан пример такого рисунка.

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

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

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

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

Затем растровое изображение выглядит так, как показано на следующей схеме.

Схема развернутого макета растрового изображения для более светло-зеленого и темного зеленого.

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