01.ベースOpenGLビュークラスを作る
OpenGLの初期化処理と終了処理を行い、OpenGLを用いた描画処理の骨格を担う、ベースOpenGLビュークラスを作成します。
解説
OpenGLを使用して描画をするためにすべきことは、以下です。
- 初期化処理として、wglCreateContext関数を用いて、レンダリングコンテキストを作成する。
- 初期化処理として、wglMakeCurrent関数を用いて、作成したレンダリングコンテキストをカレントレンダリングコンテキストに設定する。
- ビューのサイズが変更された際に呼び出されるOnSize関数で、ビューポートの設定、投影変換行列の構築、モデリングビューイング変換行列の構築をする。
- ビューを描画する時に呼び出されるOnDraw関数で、モデル描画の処理をする。
プロジェクトの作成
「メニュー/新規作成/プロジェクト」を選択します。
テンプレート:Visual C++
テンプレート:MFC アプリケーション
プロジェクト名:OpenGLBase
場所:適当なフォルダを指定
ソリューションのディレクトリの作成:チェックしない
でOKボタンを押します。
次へボタンを押します。
アプリケーションの種類:シングル ドキュメント
プロジェクト形式:MFC 標準
MFCの使用:共有DLLでMFCを使用
ドキュメント ビュー アーキテクチャー サポート:チェックする
SDLチェック:チェックする
リソース言語:日本語
で次へボタンを押します。
設定を変更せず次へボタンを押します。
設定を変更せず次へボタンを押します。
設定を変更せず次へボタンを押します。
コマンドバー(メニュー/ツールバー/リボン)
クラシックメニューを使用する:チェック
クラシックのドッキング可能ツールバーを使用する:チェックしない
ブラウザースタイルのツールバーを使用する:チェックしない
すべてチェックを外す。
次へボタンを押します。
設定を変更せず完了ボタンを押します。
ビルドし、エラー、警告がないことを確認します。
OpenGLのヘッダーファイルのインクルード
OpenGLBaseView.h に以下の2行のOpenGLのヘッダーファイルのインクルードを追加します。
#include <gl\gl.h>
#include <gl\glu.h>
ビルドし、エラー、警告がないことを確認します。
OpenGLのlibファイルをプロジェクトに追加
OpenGLBaseView.cpp に以下の2行のOpenGLのlibファイルをプロジェクトに追加する記述を追加します。
#pragma comment( lib, "opengl32.lib"
)
#pragma comment( lib, "glu32.lib"
)
ビルドし、エラー、警告がないことを確認します。
メンバ変数、メンバ関数の宣言の追加
OpenGLBaseView.h のベースOpenGLビュークラス定義の最初にメンバ変数、メンバ関数の宣言を追加します。
ビルドし、エラー、警告がないことを確認します。
メンバ変数の初期化
OpenGLBaseView.cpp のベースOpenGLビュークラスのコンストラクタにメンバ変数の初期化を追加します。
ビルドし、エラー、警告がないことを確認します。
OpenGL初期化処理
OpenGLBaseView.cpp にOpenGL初期化処理の定義を追加します。
ビルドし、エラー、警告がないことを確認します。
OpenGL終了処理
OpenGLBaseView.cpp にOpenGL終了処理の定義を追加します。
ビルドし、エラー、警告がないことを確認します。
ビューポート設定処理
OpenGLBaseView.cpp にビューポート設定処理の定義を追加します。
ビルドし、エラー、警告がないことを確認します。
投影変換行列の構築処理
OpenGLBaseView.cpp に投影変換行列の構築処理の定義を追加します。
ビルドし、エラー、警告がないことを確認します。
モデリングビューイング変換行列の構築処理
OpenGLBaseView.cpp にモデリングビューイング変換行列(モデリング変換とビューイング変換についての変換行列)の構築処理の定義を追加します。
ビルドし、エラー、警告がないことを確認します。
描画処理
OpenGLBaseView.cpp に描画処理の定義を追加します。
ビルドし、エラー、警告がないことを確認します。
PreCreateWindow関数の編集
OpenGLが他のウィンドウに描画するのを防ぐために、以下の行を OpenGLBaseView.cpp のベースOpenGLビュークラスのPreCreateWindow関数に追加します。
(PreCreateWindows関数は、デストラクタ関数(COpenGLBaseView::~COpenGLBaseView())のすぐ下にあります。)
cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
ビルドし、エラー、警告がないことを確認します。
OnEraseBkgnd関数の追加、編集
プロパティウィンドウを用いて、ベースOpenGLビュークラスにWM_ERASEBKGNDメッセージに対応するメッセージハンドラOnEraseBkgnd関数を追加します。
(メッセージハンドラの追加は、「クラスビュー」と「プロパティビュー」を使用します。
まず、「クラスビュー」で、メッセージハンドラを追加するクラスを選択します。
次に、「プロパティビュー」のツールバーの「メッセージ」を選択します。追加するメッセージ「WM_XXX」の右側のドロップダウンリストを用いてメッセージハンドラを追加します)
画面の描画はOpenGLがすべてを行うので、既定の画面背景消去処理を無効にします。
元からあるreturn文をコメントアウトし、
return TRUE;
を追加します。
ビルドし、エラー、警告がないことを確認します。
OnSize関数の追加、編集
ベースOpenGLビュークラスにWM_SIZEメッセージに対応するメッセージハンドラOnSize関数を追加します。
(メッセージハンドラの追加は、「クラスビュー」と「プロパティビュー」を使用します。
まず、「クラスビュー」で、メッセージハンドラを追加するクラスを選択します。
次に、「プロパティビュー」のツールバーの「メッセージ」を選択します。追加するメッセージ「WM_XXX」の右側のドロップダウンリストを用いてメッセージハンドラを追加します)
OpenGL初期化処理、ビューポート設定処理、視野角錐台設定処理、視点座標変換処理のメンバ関数の呼び出しを追加します。
ビルドし、エラー、警告がないことを確認します。
OnDestroy関数の追加、編集
ベースOpenGLビュークラスにWM_DESTROYメッセージに対応するメッセージハンドラOnDestroy関数を追加します。
(メッセージハンドラの追加は、「クラスビュー」と「プロパティビュー」を使用します。
まず、「クラスビュー」で、メッセージハンドラを追加するクラスを選択します。
次に、「プロパティビュー」のツールバーの「メッセージ」を選択します。追加するメッセージ「WM_XXX」の右側のドロップダウンリストを用いてメッセージハンドラを追加します)
OpenGL終了処理のメンバ関数の呼び出しを追加します。
ビルドし、エラー、警告がないことを確認します。
OnDraw関数の編集
OpenGLBaseView.cpp のOnDraw関数に描画に関するOpenGL関数の呼び出しおよび描画処理のメンバ関数の呼び出しを追加します。
(OnDraw関数は、PreCreateWindows関数のすぐ下にあります。)
ビルドし、エラー、警告がないことを確認します。
実行
ダウンロード
ソースファイルダウンロード (ModelViewerOpenGLMFC2015_01_base.zip)