![見出し画像](https://assets.st-note.com/production/uploads/images/163159383/rectangle_large_type_2_33ed28b4cc04bbeb027f368e79eac57b.png?width=1200)
GDIをOpenGLに替える
Windowsアプリケーションのウィンドウは通常 GDI(Graphic Device Interface)関数を使って描画している。
これを3次元コンピュータグラフィックライブラリ OpenGL を使った描画に置き換えることができる。
この記事にはそのために必要なコードをメモしておく。
決まりきった処理ではあるし工夫の余地もほとんどないのだが、アプリケーションの作り始めに1回書けばあとはそうそう見ることも変えることもないので、何も見ない状態でぱっと書くのは意外と難しい。
もし何もないところから OpenGL アプリケーションを作らないといけなくなったら、これをコピーすれば事足りる。
前提条件
コードは C++で書いている。
Visual Studio 2022 Community を使ってビルドしている。
動作確認は Windows 11 で行っている。
コード
OpenGLで描画するコントロール(ウィンドウ)のハンドル hWnd を入力して、デバイスコンテキストhDCとレンダリングコンテキストhRCを取得する。
関数が成功すると true を返し、失敗すると false を返す。
bool SetupOpenGLView( HWND hWnd, HDC& hDC, HGLRC& hRC )
{
hDC = ::GetDC( hWnd );
PIXELFORMATDESCRIPTOR pfd;
::memset( &pfd, 0x00, sizeof( PIXELFORMATDESCRIPTOR ) );
pfd.nSize = sizeof( PIXELFORMATDESCRIPTOR );
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL
| PFD_GENERIC_ACCELERATED | PFD_DOUBLEBUFFER
| PFD_SWAP_LAYER_BUFFERS;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.iLayerType = PFD_MAIN_PLANE;
pfd.cColorBits = 32;
pfd.cAlphaBits = 0;
pfd.cAccumBits = 0;
pfd.cDepthBits = 32;
pfd.cStencilBits = 32;
pfd.bReserved = 16+1;
int pixelFormatIndex = ::ChoosePixelFormat( hDC, &pfd );
if ( pixelFormatIndex == 0 ) return false;
if ( FALSE == ::SetPixelFormat( hDC, pixelFormatIndex, &pfd ) ) return false;
hRC = ::wglCreateContext( hDC );
if ( hRC == 0 ) return false;
::wglMakeCurrent( hDC, hRC );
return true;
}
なおプロジェクト設定のリンカーオプションで、入力 - 追加の依存ファイルにopengl32.lib、user32.lib、glu32.lib を指定している。