2

私はSDLライブラリを学習しており、サーフェスを作成するための関数の1つはSDL_CreateRGBSurfaceです。私が疑問に思っている4つのパラメーターは、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}. で指定された のビットは 0、 でcolor指定されRmaskたビットGmask0x80 == 128、 で指定されたビットBmaskは 0 です。同じ色のマスクを逆にする場合:

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

色は青になります {R=0, G=0, B=128}. あなたが見ている例では、アルファチャンネルなしで 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 に答える