什么是面具值?

时间:2010-10-29 02:02:05

标签: sdl mask

我正在学习SDL库,其中一个创建曲面的函数是SDL_CreateRGBSurface。我想知道的四个参数是R,G,B和A掩模。在这种情况下,面具究竟是什么?

我也关注了一本关于SDL的书,作者传递了5位红色,5位蓝色和6位绿色作为掩码值。这意味着什么?掩码值有什么作用?

我使用随机数(Uint32颜色)在屏幕上填充了一个矩形并变为绿色。当我更改了遮罩值时,我注意到即使使用相同的颜色值也会改变颜色。

1 个答案:

答案 0 :(得分: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 == 128Bmask指定的位为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。