[OpenGL] GLUT
GLUTとは?
GLUTとは<openGL Utility Toolkit>の略でその名のとおり,便利なツールです.GLUTでソースをかけば,GLUTが用意されている環境ならば初期化から描画コードまでほぼ同じソースでコンパイル,実行することができます.
GLUTを使用するにはまずGLUTをダウンロードする必要があります.linkからダウンロードしてください.ソースファイルもいっしょにダウンロードすると様々なサンプルがついてきます.試してみてください.MacOSXではGLUTはデフォルトで用意されていますが,WindowsではGLUTは標準ライブラリではありません.もし,GLUTを利用したアプリケーションを配布するならば,"glut32.dll"ファイルを同梱しなければなりません.
まず,GLUTをインストールします.といっても簡単でGLUTのホームページからバイナリ版をダウンロードし,解凍します.その中からglut32.libをコンパイラのライブラリフォルダへ,ヘッダをヘッダフォルダのglフォルダにコピーします.またglut32.dllはシステムフォルダ,"system32"へコピーしておきます.これらのインストール先はパスさえ通せばどこでもよいのですが,上記の場所がわかりやすいと思います.Visual C++ならば下記のようになります.
"glut.h"は"C:¥Program Files¥Microsoft Visual Studio¥VC98¥Include¥GL"へコピー. "glut32.lib"は"C:¥Program Files¥Microsoft Visual Studio¥VC98¥Lib"へコピー. "glut32.dll"は,"C:¥WINNT¥system32"へコピー.
メイン・サンプル
GLUT自体はいたって簡単です.今までWindowsでも,MacOSXでも長ったらしい初期化コードを書きましたが,GLUTならばこれで終わりです.
int main(int argc, char** argv){ //GLUT初期化 glutInit(&argc, argv); //GLUTピクセルフォーマット glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); //ウィンドウの初期化と作成 glutInitWindowSize (WIDTH,HEIGHT); glutInitWindowPosition (100, 100); glutCreateWindow ("Simple GLUT"); //メインループ glutMainLoop(); return 0; }
GLUTならば,これだけのAPIでOpenGLのウィンドウが作成できます.便利でしょ.各APIに関しても簡単だと思います.glutInitでアプリケーションを登録,起動します.次にglutInitDisplayでピクセルフォーマットを自動設定し,glutInitWindow〜でウィンドウの場所とサイズを指定します.そして最後に,glutCreateWindowで引数の名前のついたウィンドウを作成します.
GLUT API概要
GLUTは,OS固有のプログラミングを吸収してくれます.簡単な概念図は下のようになります.(実際はOpenGLもOS-APIをコールしています.)

つまりGLUTを通してOS固有のプログラミングをしていることになります.GLUTがどの環境でも動作する理由はこのOS固有のプログラミングをGLUTライブラリが吸収してくれているからです.実際のGLUTのソースを見るとわかりますが,Windows版GLUTの中身はWindowsSDKプログラミングとなっていますし,MacOSXではCarbonで書かれています.
描画コード
GLUTではマウスイベント,OSアイドリング,リサイズ時などのOSからの呼び出しが必要な処理は,GLUTに関数を登録することでそれらを処理します.
実際にはGLUTに対して,関数のポインタを与えていることになり,このGLUTにイベント処理を行う関数を登録することをCallBack registrationと呼びます.
例えばglutMouseFuncは,マウスクリック,アップなどのイベントが起こったときにどの関数を呼び出すかをGLUTに登録するものです.他にはglutIdleFuncや,glutDisplayFuncなどがあります.
//各処理関数の登録 glutDisplayFunc(display); glutReshapeFunc(resize);
この例では再描画命令が出たときに呼び出される関数をvoid display(void),リサイズ命令が出たときに呼び出される関数にvoid resize(int x,int y)を設定しています. 当然,登録する関数はGLUTが指定する形式の関数でなければいけません.
glutMouseFuncでは,戻り値がvoid,引数にint型を4つ持つ関数でなければいけません.詳しいことは赤本,緑本などを参考にしてください.ネット上では日本語訳サイトもあります.
コールバックの登録〜Callback Registration
最後にOpenGLを開放します.開放はViewクラスのデストラクタに行わせます.
// OpenGLの開放 wglMakeCurrent(NULL,NULL); wglDeleteContext(hRC); delete cDC;
このコードをViewクラスのデストラクタに書き足すことになります.
確実なコーディングを行うならば,確保できているか確認するために,hRCとcDCがNULLでないかをチェックしてから開放した方がいいでしょう.
ソースコード
http://code.google.com/p/sonson-code/source/browse/#svn/trunk/gl/glut
http://code.google.com/p/sonson-code/source/browse/#svn/trunk/gl/simple_glut