Текстуры с альфа-каналамиTextures with alpha channels

Существует два способа кодирования карт текстур с более сложной прозрачностью.There are two ways to encode texture maps that exhibit more complex transparency. В каждом случае блок, описывающий прозрачность, предшествует 64-разрядному блоку, который уже был описан.In each case, a block that describes the transparency precedes the 64-bit block already described. Прозрачность представляется либо в виде точечного рисунка 4x4 с 4 битами на пиксель (явная кодировка) или с меньшим количеством битов и линейной интерполяцией, которая аналогична тому, что используется в кодировании цвета.The transparency is either represented as a 4x4 bitmap with 4 bits per pixel (explicit encoding), or with fewer bits and linear interpolation that is analogous to what is used for color encoding.

Блок прозрачности и цветовой блок упорядочиваются так, как показано в следующей таблице.The transparency block and the color block are arranged as shown in the following table.

Адрес словаWord address 64-разрядный блок64-bit block
3:03:0 Блок прозрачностиTransparency block
7:47:4 Вышеописанный 64-разрядный блокPreviously described 64-bit block

Кодирование явные текстурыExplicit texture encoding

Для явного кодирования текстур (формат BC2) альфа-компоненты текселей, которые описывают прозрачность, кодируются в точечный рисунок размером 4x4 пикселя, 4 бита на пиксель.For explicit texture encoding (BC2 format), the alpha components of the texels that describe transparency are encoded in a 4x4 bitmap with 4 bits per texel. Эти четыре бита можно получить различными способами, например с помощью сглаживания или используя четыре наиболее важных бита данных альфа-канала.These four bits can be achieved through a variety of means such as dithering or by using the four most significant bits of the alpha data. Как бы они ни были получены, они используются в текущем виде, без интерполяции в любой форме.However they are produced, they are used just as they are, without any form of interpolation.

На следующей схеме показан блок 64-разрядной прозрачности.The following diagram shows a 64-bit transparency block.

Диаграмма 64-разрядного блока прозрачности

Примечание    метод сжатия Direct3D использует четыре старшие биты.Note   The compression method of Direct3D uses the four most significant bits.

 

В следующих таблицах показано, как размещены в памяти данные альфа-канала для каждого 16-разрядного слова.The following tables illustrate how the alpha information is laid out in memory, for each 16-bit word.

Структура для слова 0:Layout for word 0:

БитыBits Альфа-каналAlpha
3:0 (LSB*)3:0 (LSB*) [0][0][0][0]
7:47:4 [0][1][0][1]
11:811:8 [0][2][0][2]
15:12 (MSB*)15:12 (MSB*) [0][3][0][3]

 

*наименее значимый бит, наиболее значимых бита (MSB)*least-significant bit, most significant bit (MSB)

Структура для слова 1:Layout for word 1:

БитыBits Альфа-каналAlpha
3:0 (LSB)3:0 (LSB) [1][0][1][0]
7:47:4 [1][1][1][1]
11:811:8 [1][2][1][2]
15:12 (MSB)15:12 (MSB) [1][3][1][3]

 

Структура для слова 2:Layout for word 2:

БитыBits Альфа-каналAlpha
3:0 (LSB)3:0 (LSB) [2][0][2][0]
7:47:4 [2][1][2][1]
11:811:8 [2][2][2][2]
15:12 (MSB)15:12 (MSB) [2][3][2][3]

 

Структура для слова 3:Layout for word 3:

БитыBits Альфа-каналAlpha
3:0 (LSB)3:0 (LSB) [3][0][3][0]
7:47:4 [3][1][3][1]
11:811:8 [3][2][3][2]
15:12 (MSB)15:12 (MSB) [3][3][3][3]

 

Сравнение цвета, используемое в BC1 для определения прозрачности текселя, в данном формате не используется.The color compare used in BC1 to determine if the texel is transparent is not used in this format. Предполагается, что без сравнения цвета цветовые данные всегда обрабатываются в четырехцветном режиме.It is assumed that without the color compare the color data is always treated as if in 4-color mode.

Линейная интерполяция альфа-три разрядаThree-bit linear alpha interpolation

Кодирование прозрачности для формата BC3 основано на концепции, аналогичной линейному кодированию, используемому для цвета.The encoding of transparency for the BC3 format is based on a concept similar to the linear encoding used for color. Два 8-разрядных альфа-фактора и точечный рисунок 4x4 с тремя битами на пиксель хранятся в первых восьми байтах блока.Two 8-bit alpha values and a 4x4 bitmap with three bits per pixel are stored in the first eight bytes of the block. Репрезентативные альфа-факторы используются для интерполяции промежуточных альфа-факторов.The representative alpha values are used to interpolate intermediate alpha values. Дополнительная информация содержится в способе хранения двух альфа-факторов.Additional information is available in the way the two alpha values are stored. Если альфа-_0 больше, чем альфа-канал_1, а затем шесть промежуточные альфа-значения, создаваемые в интерполяции.If alpha_0 is greater than alpha_1, then six intermediate alpha values are created by the interpolation. В противном случае четыре промежуточных альфа-фактора интерполируются между указанными крайними альфа-факторами.Otherwise, four intermediate alpha values are interpolated between the specified alpha extremes. Два дополнительных неявных альфа-фактора: 0 (полностью прозрачный) и 255 (полностью непрозрачный).The two additional implicit alpha values are 0 (fully transparent) and 255 (fully opaque).

Следующий пример кода иллюстрирует этот алгоритм.The following code example illustrates this algorithm.

// 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
}

Схема памяти альфа-блока выглядит следующим образом.The memory layout of the alpha block is as follows:

ByteByte Альфа-каналAlpha
00 Альфа-канал_0Alpha_0
11 Альфа-канал_1Alpha_1
22 [0][2] (2 MSBs), [0][1], [0][0][0][2] (2 MSBs), [0][1], [0][0]
33 [1][1] (1 MSB), [1][0], [0][3], [0] [2] (1 LSB)[1][1] (1 MSB), [1][0], [0][3], [0][2] (1 LSB)
44 [1][3], [1][2], [1][1] (2 LSBs)[1][3], [1][2], [1][1] (2 LSBs)
55 [2][2] (2 MSBs), [2][1], [2][0][2][2] (2 MSBs), [2][1], [2][0]
66 [3][1] (1 MSB), [3][0], [2][3], [2] [2] (1 LSB)[3][1] (1 MSB), [3][0], [2][3], [2][2] (1 LSB)
77 [3][3], [3][2], [3][1] (2 LSBs)[3][3], [3][2], [3][1] (2 LSBs)

 

Сравнение цвета, используемое в BC1 для определения прозрачности текселя, в данных форматах не используется.The color compare used in BC1 to determine if the texel is transparent is not used with these formats. Предполагается, что без сравнения цвета цветовые данные всегда обрабатываются в четырехцветном режиме.It is assumed that without the color compare the color data is always treated as if in 4-color mode.

Связанные разделыRelated topics

Сжатые текстурными ресурсамиCompressed texture resources