見出し画像

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 を指定している。

いいなと思ったら応援しよう!