2

我正在学习 SDL 库,创建表面的函数之一是 SDL_CreateRGBSurface。我想知道的四个参数是 R、G、B 和 A 掩码。在这种情况下,面具到底是什么?

我还在关注一本关于 SDL 的书,作者为掩码值传递了 5 位红色、5 位蓝色和 6 位绿色。那是什么意思呢?掩码值有什么作用?

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

4

1 回答 1

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,指定的位Gmask0x80 == 128,指定的位Bmask为 0。如果要反转相同颜色的掩码:

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

现在颜色将为蓝色 {R=0, G=0, B=128}。您正在查看的示例似乎使用没有 Alpha 通道的 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, B=20}。(绿色的额外位意味着需要将值减半才能对其进行标准化)。

我不确定 SDL 究竟是如何做到的,或者你可以在 SDL 中使用哪些类型的疯狂掩码,但我想实际的算法是按照 bitwise 的路线AND,然后右移尽可能多的位面具中最不重要的部分?或者从最高有效位到最低有效位,对于掩码中设置的每个位,如果设置了颜色的相应位,则将总数左移并加 1。

于 2010-10-29T02:34:30.017 回答