什么是面具值?

Shr*_*ers 2 sdl mask

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

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

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

use*_*379 6

基本上发生的事情是,当SDL确定要显示的每种颜色的大小时,它会查看掩码中设置的哪些位以确定要在颜色中注意哪些位.它并不像按位那样简单,AND因为值会被移位.例如,

color = 0x00800000 = 00000000 10000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)

你已经设置了面具

Rmask = 0xFF000000 = 11111111 00000000 00000000 00000000
Gmask = 0x00FF0000 = 00000000 11111111 00000000 00000000
Bmask = 0x0000FF00 = 00000000 00000000 11111111 00000000
Amask = 0x000000FF = 00000000 00000000 00000000 11111111
Run Code Online (Sandbox Code Playgroud)

那么颜色将是绿色{R = 0,G = 128,B = 0}.的位color通过指定Rmask是0时,由所指定的比特Gmask0x80 == 128,并通过所指定的比特Bmask是0.如果你要反转为相同颜色的掩模:

Rmask = 0x000000FF
Gmask = 0x0000FF00
Bmask = 0x00FF0000
Amask = 0xFF000000
Run Code Online (Sandbox Code Playgroud)

现在颜色将为蓝色{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
Run Code Online (Sandbox Code Playgroud)

颜色为{R = 2,G = 17/2 = 8.5,B = 20}.(绿色的额外位表示需要将值减半以对其进行标准化).

我不确定SDL是如何做到这一点的,或者你可以使用SDL使用哪种类型的疯狂掩码,但我认为实际的算法是按位进行的AND,然后右移多少位清除面具最不重要的部分?或者,从最高有效位到最低有效位,对于在掩码中设置的每个位,移位总左,如果设置了相应的颜色位,则加1.