2010-10-29 154 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}。通过Rmask指定的color位为0,通过Gmask0x80 == 128指定的位,并通过Bmask指定位为0如果你扭转了相同颜色的面具:

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

现在颜色会是蓝色{R = 0,G = 0,B = 128}。看来你正在看的例子使用16位颜色而没有alpha通道。由于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,B = 20}。 (绿色的额外位表示该值需要减半以归一化)。

我不确定SDL是怎么做的,或者SDL可以使用哪种疯狂的面具,但我会想象实际的算法是沿着一个按位的AND,然后右移很多位在掩码最不重要的部分被清除?或者从最高有效位到最低有效位进行工作,对于在掩码中设置的每个位,将总的左移一位,如果颜色的相应位置位,则加1。

+0

感谢user470379。我非常感谢您在回复中付出的努力!当你说“它看起来在掩码中设置了哪些位以确定哪些位需要注意的颜色”这是否意味着,例如,如果有更多位被放入绿色,则蓝色和红色不会显示出来如果表面使用红色或蓝色,是非常好还是较暗? – ShrimpCrackers 2010-10-29 03:30:22