2010-10-29 10 views
2

Я изучаю библиотеку SDL, и одна из функций для создания поверхности - это SDL_CreateRGBSurface. Четыре параметра, о которых мне интересно, это маски R, G, B и A. Что такое маска в этом контексте?Что такое значение маски?

Я также следую книге о SDL, и автор передал в 5 бит красного, 5 бит синего и 6 бит зеленого цвета для значений маски. Что это значит? Что делают значения маски?

Я заполнил прямоугольник на экране, используя случайное число (цвет Uint32) и получил зеленый цвет. Когда я изменил значения маски, я заметил, что цвет изменился даже с тем же значением цвета.

ответ

6

В основном, что происходит, когда SDL определяет, сколько из каждого цвета отображается, он смотрит, какие биты установлены в маске, чтобы определить, какие биты нужно обратить внимание в цвете. Это не так просто, как поразрядное AND, потому что значения сдвинуты. Например,

color = 0x00800000 = 00000000 10000000 00000000 00000000 

и вы установили свои маски, чтобы быть

Rmask = 0xFF000000 = 11111111 00000000 00000000 00000000 
Gmask = 0x00FF0000 = 00000000 11111111 00000000 00000000 
Bmask = 0x0000FF00 = 00000000 00000000 11111111 00000000 
Amask = 0x000000FF = 00000000 00000000 00000000 11111111 

тогда цвет будет зеленым {R = 0, G = 128, B = 0}. Биты color указанных Rmask являются 0, битами, указанных Gmask являются 0x80 == 128, а биты, указанных Bmask равны 0. Если вы должны были полностью изменить маски для одного цвета:

Rmask = 0x000000FF 
Gmask = 0x0000FF00 
Bmask = 0x00FF0000 
Amask = 0xFF000000 

теперь цвета будет быть синим {R = 0, G = 0, B = 128}. Похоже, что пример, который вы ищете, использует 16-битный цвет без альфа-канала. Поскольку 16 бит не делятся равномерно на 3 цветовых канала, зеленый получает дополнительный бит (поскольку человеческий глаз считается более чувствительным к зеленому).

Пример:

color = 0x1234 = 00010 010001 10100 

Rmask = 0xF800 = 11111 000000 00000 
Gmask = 0x07E0 = 00000 111111 00000 
Bmask = 0x001F = 00000 000000 11111 
Amask = 0 

Цвет будет {R = 2, G = 17/2 = 8,5, В = 20}. (дополнительный бит для зеленого означает, что значение должно быть сокращено в два раза, чтобы нормализовать его).

Я не уверен, как именно это делает SDL, или какие типы сумасшедших масок вы можете использовать с SDL, но я бы предположил, что фактический алгоритм находится по строкам поразрядного AND, а затем сдвигается вправо так, как многие биты, которые очищаются в наименее значимой части маски? Или же работая от наиболее значимого до младшего значащего бита, для каждого бит, установленного в маске, сдвиньте общее левое и добавьте 1, если установлен соответствующий бит цвета.

+0

Спасибо user470379. Я очень ценю усилия, которые вы вложили в свой ответ! Когда вы говорите, что «он смотрит, какие биты установлены в маске, чтобы определить, какие биты нужно обратить внимание в цвете», означает ли это, например, если больше бит помещается в зеленый цвет, синий и красный цвета не отображаются очень хорошо или темнее, если для поверхности используются красные или синие цвета? – ShrimpCrackers

Смежные вопросы