WindowsアプリでOpenGLを使ってプログラムを組む時の初期化処理の一環で、次のようにピクセルフォーマットを設定してやる必要があります。これを紹介しているサイトはいくつも見つかりますが、これが一体なにを示しているのか?まで解説しているところがないので調べてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
int SetupPixcelFormat(HDC hDC) { PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), /* nSize */ 1, /* nVersion */ PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, /* dwFlags */ PFD_TYPE_RGBA, /* iPixelType */ 32, /* cColorBits */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, /* cDepthBits */ 8, /* cStencilBits */ 0, PFD_MAIN_PLANE, /* iLayerType */ 0, 0, 0, 0 }; int pixelformat = ::ChoosePixelFormat(hDC, &pfd); if (0 == pixelformat) return FALSE; if (!::SetPixelFormat(hDC, pixelformat, &pfd)) return FALSE; return TRUE; } |
この部分って定型になっていて、気にしなくてもOpenGLプログラミングできますが、一度気になると調べたくなる性分なので仕方ない。
ここで使っているAPIの1つ目はChoosePixelFormat()です。このAPIはアプリを動作させるPC上で使用可能なピクセルフォーマットの番号を返してくれます。第一引数のhDCにはOpenGLで描画するウィンドウのデバイスコンテキストを指定します。第二引数のpfdにはPIXELFORMATDESCRIPTOR 変数のアドレスを指定します。前処理として、このPIXELFORMATDESCRIPTOR のメンバ変数に値を設定してやる必要があります。
PIXELFORMATDESCRIPTORのサイズ。Windows APIでよくやる手法です。nVersion
絶対1です。
dwFlags
ここで使用目的を指定します。OpenGLではこうです。
(0x01)PFD_DOUBLEBUFFER – ダブルバッファリングで描画高速化
(0x04)PFD_DRAW_TO_WINDOW – ウィンドウに対する描画
(0x20)PFD_SUPPORT_OPENGL – OpenGLサポート
iPixelType
PFD_TYPE_RGBAでRGBAでの使用を宣言します。
もう一つPDF_TYPE_COLORINDEXがありますが、こちらは使いません。
cColorBits
使用する色のビット数を指定します。
8bit – 白黒
24bit – RGB(赤緑青)
32bit – RGBA(赤緑青+透明度)
これを実行すると入力に応じて適切な番号が返ってくるので、これをSetPixcelFormat()に渡してデバイスコンテキストが使用するピクセルフォーマットとして設定するわけです。
ちなみにそのPCでどのようなピクセルフォーマットが使用可能かを取得するAPIも存在します。
1 |
DescribePixelFormat(hDC, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd); |
DescribePixelFormat(hDC, 0, 0, NULL);でそのPCにあるピクセルフォーマットの個数が返ります。あとは第二引数にその番号を入れてやれば情報を取得することができます。ChoosePixelFormat() で帰ってきた番号を入れることで、OpenGLで使うピクセルフォーマットの内容も分かります。私の環境ではこうなっていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
pfd = { sizeof(PIXELFORMATDESCRIPTOR), /* nSize */ 1, /* nVersion */ PFD_DRAW_TO_WINDOW /* dwFlags */ | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, /* iPixelType */ 32, /* cColorBits */ 8, 16, 8, 8, 8, 0, 8, 24, /* R/G/B/A のビット位置 */ 64, 16, 16, 16, 16, /* cAccum* のビット数 */ 24, /* cDepthBits */ 8, /* cStencilBits */ 0, /* cAuxBuffers */ PFD_MAIN_PLANE, /* iLayerType */ 0, 0, 0, 0}; |