OpenGLをMFCで使ってみる

スクリーンショット_070613_055743_PM

OpenGLは「Open Glaphic Library」の略で、3次元グラフィックスを扱うためのライブラリです。

OpenGLを用いることで比較的簡単に3Dグラフィックスを導入することができます。

ここではMFCプログラミングにOpenGLを導入する方法を紹介します。

設定

OpenGLはすでにWindowsにインストールされいます。

ですから、

  • 「gl/gl.h」と「gl/glu.h」のインクルード
  • 「opengl32.lib」と「glu32.lib」のリンク

で使えるようになります。

まず、プロジェクトを作成します。

スクリーンショット_070613_055743_PM

ここでは「Test」という名前のMFCアプリケーションにしました。

あとは自分の好きな設定にしてください。ここではいきなり「完了」としました。

 

インクルードとリンク

プロジェクトを作成したら、OpenGLを使いたい場所に

#include <gl/gl.h>

#include <gl/glu.h>

を追記します。これでインクルードを完了です。

 

リンクについては「プロジェクト」->「○○○のプロパティ」を選択します。

そして、「リンク」->「入力」に

  • opengl32.lib
  • glu32.lib

スクリーンショット_070613_060757_PM

を入力します。これでOpenGLを使用できるようになります。

OpenGLを使ってみる

せっかくなのでOpenGLを使ってみます。

初期設定

まず、OpenGLでは初期設定が必要なので、「WM_CREATE」に初期設定を記述します。

 

スクリーンショット_070613_061008_PM

クラス「CTestView」のプロパティからWM_CREATEを選択して、ウインドウが構成された際の命令を記述します。

あと、初期化の際、変数

HGLRC m_hGLRC

によりOpenGLを操作するので、この変数を追加します。クラス「CTestView」に追加しておきましょう。

スクリーンショット_070613_062115_PM

初期化は以下のようにします。長いですが、おまじない程度に思ってください。

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でバッファをクリアしています。これらを実行することで画面が指定した色になるわけです。

スクリーンショット_070613_063222_PM

ただの青画面ですが、OpenGLを通して青色の場面を描写することができました。

著者:安井 真人(やすい まさと)