Непрозрачные и 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. Пример того, где этот формат можно использовать, — листья на дереве, показанные на синем небе. Некоторые тексели можно пометить как прозрачные, а три оттенка зеленого по-прежнему доступны для листьев. Два цвета исправляют крайности, а третий — интерполированный цвет.
На следующем рисунке показан пример такого рисунка.
Где изображение отображается как белый, тексель будет закодирован как прозрачный. Компоненты RGBA прозрачных текселей должны быть равны нулю перед смешения.
Кодировка растрового изображения для цветов и прозрачности определяется с помощью следующих вычислений.
00 ? color_0
01 ? color_1
10 ? 1/2 color_0 + 1/2 color_1
11 ? Transparent
Затем растровое изображение выглядит так, как показано на следующей схеме.
Связанные темы