OpenGLをMFCで使ってみる
2013年7月7日:OpenGL
OpenGLは「Open Glaphic Library」の略で、3次元グラフィックスを扱うためのライブラリです。
OpenGLを用いることで比較的簡単に3Dグラフィックスを導入することができます。
ここではMFCプログラミングにOpenGLを導入する方法を紹介します。
設定
OpenGLはすでにWindowsにインストールされいます。
ですから、
- 「gl/gl.h」と「gl/glu.h」のインクルード
- 「opengl32.lib」と「glu32.lib」のリンク
で使えるようになります。
まず、プロジェクトを作成します。
ここでは「Test」という名前のMFCアプリケーションにしました。
あとは自分の好きな設定にしてください。ここではいきなり「完了」としました。
インクルードとリンク
プロジェクトを作成したら、OpenGLを使いたい場所に
#include <gl/gl.h>
#include <gl/glu.h>
を追記します。これでインクルードを完了です。
リンクについては「プロジェクト」->「○○○のプロパティ」を選択します。
そして、「リンク」->「入力」に
- opengl32.lib
- glu32.lib
を入力します。これでOpenGLを使用できるようになります。
OpenGLを使ってみる
せっかくなのでOpenGLを使ってみます。
初期設定
まず、OpenGLでは初期設定が必要なので、「WM_CREATE」に初期設定を記述します。
クラス「CTestView」のプロパティからWM_CREATEを選択して、ウインドウが構成された際の命令を記述します。
あと、初期化の際、変数
HGLRC m_hGLRC
によりOpenGLを操作するので、この変数を追加します。クラス「CTestView」に追加しておきましょう。
初期化は以下のようにします。長いですが、おまじない程度に思ってください。
int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: ここに特定な作成コードを追加してください。 static PIXELFORMATDESCRIPTOR pfd={ sizeof(PIXELFORMATDESCRIPTOR), //構造体のサイズ 1, //構造体のバージョン PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL, //※1参照 PFD_TYPE_RGBA, //ピクセルデータのタイプここではRGBAを選択 24, //カラーバッファーのサイズ。通常は24bitカラーか32bit 0,0,0, //未使用 0,0,0, 0,0, 0,0,0,0,0, 32, //デブスバッファー。Zバッファ法で使用する 0, //ステンシルバッファのサイズ 0, //補助バッファ PFD_MAIN_PLANE, 0, //オーバーレイブレイン、アンダーレイブレインの数 0, //未使用 0, 0 }; CClientDC dc(this); //ピクセルフォーマットの設定 int pfdID=::ChoosePixelFormat(dc.GetSafeHdc(),&pfd); if(pfdID==0){ return -1; } BOOL bResult=::SetPixelFormat(dc.GetSafeHdc(),pfdID,&pfd); if(bResult==FALSE){ return -1; } //レンダリングコンテキストの生成 m_hGLRC=::wglCreateContext(dc.GetSafeHdc()); if(m_hGLRC==NULL){ return -1; } return 0; }
終了処理
初期化したら終了した際に処理する必要があります。そのため、OnDestroyをOn_Createと同様にしてクラス「CTestView」のプロパティのメッセージより作成して以下のように記述します。
void CTestView::OnDestroy() { CView::OnDestroy(); // TODO: ここにメッセージ ハンドラー コードを追加します。 //レンダリングコンテキストの破棄 if(m_hGLRC!=NULL){ ::wglDeleteContext(m_hGLRC); } }
描写処理
これまででは、ただOpenGLを呼び出して終わらせただけなのでつまらないですね。
そこで、とりあえずOpenGLを使って画面を青で塗ってみます。
「OnDraw」に以下のようにコーディングしてください。
void CTestView::OnDraw(CDC* pDC) { CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: この場所にネイティブ データ用の描画コードを追加します。 ::wglMakeCurrent(pDC->GetSafeHdc(),m_hGLRC); ::glClearColor(0.0f,0.0f,0.25f,1.0f); ::glClear(GL_COLOR_BUFFER_BIT); ::wglMakeCurrent(NULL,NULL); }
これで実行すると以下のような画面が出力されます。wglMakeCurrentの間にOpenGLの命令を記述します。ここでは、glClearColorで色を(赤、緑、青、アルファ)を設定して、glClearでバッファをクリアしています。これらを実行することで画面が指定した色になるわけです。
ただの青画面ですが、OpenGLを通して青色の場面を描写することができました。
著者:安井 真人(やすい まさと)
@yasui_masatoさんをフォロー