2010-10-29 152 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