OpenGL アプリケーションを実装する上の注意点を記したメモ
1. 概要
本書は、OpenGL アプリケーションを実装する上の注意点を記したメモになります。
可能な限りユーティリティライブラリを利用しない方針で実装しております。
Windows XP で実行する前提で実装しており、これ以外のプラットフォームは一切考慮しません。
2. 基本的な処理構造
アプリケーション全体の処理構造を大まかな処理で分解して箇条書きします。
- OpenGL環境設定
- ピクセルフォーマット設定(画面設定、主に色かな?)
ChoosePixelFormat(), SetPixelFormat()
OpenGLではないけれど、この辺りでデバイスコンテキストのパレットを設定(SelectPalette)
- コンテキスト設定
レンダリングコンテキストとデバイスコンテキストのカレントを設定(wglCreateContext, wglMakeCurrent)
- OpenGL API をバインド
OpenGL Version 1.2 以降のAPI を利用する場合のみ。 Vertex Buffer Object を使う場合は必須
- レンダリング設定(描画時に切り替えないパラメータ設定)
深度テスト設定(glClearDepth, glEnable)
カメラ視点・設置点・角度・カメラ視界(アスペクト比など)の初期設定(gluPerspective, glMatrixMode)
- リソース確保
- モデルデータ入力(頂点、法線、UVなどをメモリに展開)
バッファオブジェクトを作る(glGenBuffers)
頂点、法線、UV座標、テクスチャをバッファオブジェクトに詰める(glBindBuffer, glBufferData, glMapBuffer, glUnmapBuffer)
- 描画(☆ここだけを終了するまでループ)
- 描画領域と深度バッファを消去
自動で消されちゃ溜まらないでしょ(glClearColor)
- レンダリング設定(必要に応じて実施、動的にエフェクトを作る時)
必要ならレンダリングパラメータを変更する(glEnable)
- モデルデータを繋げる
バッファオブジェクトをコンテキストに繋げる(glBindBuffer)
- モデルデータ出力(出力先はグラフィックボード)
グラフィックボードに描画させる(glDrawElements)
- モデルデータを切り離し
バッファオブジェクトをコンテキストから切り離す(glBindBuffer ※引数に0を指定)
- リソース解放
- モデルデータ解放
頂点バッファ、ピクセルバッファ、フレームバッファを解放(glBind*, glDelete*)
- コンテキスト解放
レンダリングコンテキストとデバイスコンテキストを切り離した上で解放(wglMakeCurrent, wglDeleteContext)
- デバイスコンテキスト解放
デバイスコンテキストからパレットなどのリソースを切り離す(SelectPalette)
API は代表的な物だけを列挙しています。 これ以外にも最低限で呼び出す必要があるAPI があります。
3 にある描画の部分は、内部起因で状態を更新する必要がある場合はタイマ契機、それ以外はWM_PAINTの契機で充分です。
又、WM_PAINT 契機で描画する場合は、デバイスコンテキストへのオブジェクト設定を描画部分で行った方がWindows のルールに沿う形になります。
3. まとめ
取り敢えず、自分の頭を整理できたので、今回は以上です。
Appendix 1. 感想
どこのページや書籍を見てもWindows に依存する実装を極端に嫌っている所ばかりです。
glutを使ったり、wgl に付いては一切触れてないとかも多い様子です。
何でだろうって? そりゃ金銭になる食い扶持だからですよ。
こんなページをみて卒業論文、設計、実装とかしてんじゃないよ。
Appendix 2. 駄文
(長いページ名だね…)
作成日:2010/11/06