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