OpenGL入門


~GLUTを使って表示~






■はじめに

気分を変えてOpenGLです。
簡単なポリゴンを表示するプログラムをつくって見ました。

まぁ、いつものように適当にファイルが入っています。

main.cppこれだけ。

あと、実行ファイル及び、プロジェクトファイルが入っています。

■OpenGL や GLUT について

OpenGL は、グラフィックAPIでDirectXと似たようなものです(というか、DirectXがWindows 専用のOpenGLというべきか・・・)。
OpenGL は、さまざまなプラットフォームで動作します。 それゆえ、OpenGL の方が幅広く使われているといえるでしょう。
OpenGL に対する私の偏見は、

I.レンダリングを丁寧に行っていて綺麗
II.DirectXみたいに直接たたいていないから遅い

でした。ところが時代は変わっています。
NVIDIA などのグラフィックチップメーカにOpenGLの開発者が流れ込んだりして、 OpenGL もハードウェア的に高速に動作します。
むしろ、Microsoftに押さえ込まれないので、 グラフィックチップメーカが最新機能を追加しようと、好き勝手に暴れまくっています。
ということで、速度が遅いなどの OpenGL を嫌う理由も特にありませんので、 挑戦してみましょう。
しいていえば、結局OSやハード依存の部分は存在するので、 「OpenGLで書けば、どのハードでも動くからOpenGL万歳」の人がいるのが個人的に嫌悪感を抱きます。

今回は、GLUT を使って、OpenGL プログラミングをします。
GLUT とは OpenGL Utility Toolkit の意味です。
GLUT は、現NVIDIA、元SGIの Mark Kilgard 御大によって作成されました。 その後、N.Robins によって Microsoft Windows に移植されました。
OpenGL の面倒な部分を隠蔽してくれます。

■GLUTセットアップ

OpenGL 自体は、Windows でサポートされているので、問題はないのですが、 GLUTは自分でインストールする必要があります。
Nate Robins 氏の Web サイトから、ダウンロードしてください。私がダウンロードした場合には、glut-3.7.6-bin.zip が最新でした。

ファイルと解凍すると、いくつかファイルがあります。
次のファイルを、それぞれの位置にコピーします。

glut.hVCのインクルードファイルが置いてある場所C:\Program Files\Microsoft Visual Studio\VC98\Include\GL とか
glut32.libVCのライブラリが置いてある場所C:\Program Files\Microsoft Visual Studio\VC98\Lib とか
glut32.dllDLL が置いてある場所C:\WINNT\system32 とか

これで、GLUT が使えるようになりました。

■ソースファイル

それではプログラムを見ていきましょう。
GLUT を使うためには、glut.h をインクルードします。

main.cpp
0010: #include <GL/glut.h>

まぁ、これを書かないと、GLUTの関数が使えないので、忘れてもすぐに気づきますね。

次にメイン関数を見てみましょう。
たった3つの関数を呼ぶだけで、ウィンドウが生成されます。

main.cpp
0034: // ---------------------------------------------------------------------------
0035: // メイン関数
0036: // ---------------------------------------------------------------------------
0037: int main(int argc, char *argv[])
0038: {
0039:     // ウィンドウの作成
0040:     glutInit(&argc, argv);              // GLの初期化
0041:     glutInitDisplayMode(GLUT_RGBA);     // 描画モード
0042:     glutCreateWindow(argv[0]);          // ウィンドウの生成
0043:     
0044:     // コールバック関数の設定
0045:     glutDisplayFunc(display);           // 描画関数
0046:     
0047:     // 一度だけすればいい設定
0048:     glClearColor(0.0, 0.0, 0.3, 0.0);   // 背景色の設定
0049: 
0050:     glutMainLoop();                     // メインループ
0051: 
0052: 
0053:     return 0;
0054: }

GLUT は、Window sと同じような、イベントドリブンなシステムを構築します。
それぞれのイベントは、コールバック関数を登録しておき、必要なときにそれらの関数を呼び出します。
それらの設定は、glut****Func の形をしています。今回は、画面の更新時にdisplay関数を呼び出すように設定します。
あとは、glClearColorで背景色を設定する適当な初期化をはさんでから、glutMainLoop()を動かします。

いじょうが大まかな流れです。
次に、再描画がかかったときに呼び出される描画関数を見ましょう。

main.cpp
0012: // ---------------------------------------------------------------------------
0013: // 画面描画
0014: // ---------------------------------------------------------------------------
0015: void display(void)
0016: {
0017:     // 画面のクリア
0018:     glClear(GL_COLOR_BUFFER_BIT);
0019:     
0020:     // ポリゴン描画
0021:     glBegin(GL_TRIANGLE_STRIP);     // ストリップ設定
0022:     glColor3d(1.0, 0.0, 0.0);       // 赤
0023:     glVertex2d(-0.9, +0.9);
0024:     glColor3d(0.0, 1.0, 0.0);       // 青
0025:     glVertex2d(+0.9, +0.9);
0026:     glColor3d(0.0, 0.0, 1.0);       // 緑
0027:     glVertex2d(-0.9, -0.9);
0028:     glColor3d(1.0, 1.0, 1.0);       // 白
0029:     glVertex2d(+0.9, -0.9);
0030:     glEnd();                        // ポリゴンの描画終了
0031: 
0032:     glFlush();                      // 画面の描画の終了
0033: }

描画のおおまかな流れも、DirectXとかわりありません。
Begin で始まって、glEnd で終わります。
その前に、glClearで画面のリフレッシュを行います。また、終わった後に、画面を実際に更新する glFlush を呼び出します。

ポリゴン自体の描画は、glBegin と glEnd でくくられた部分です。
glBegin で、表示するプリミティブを指定します。今回は、トライアングルストリップです。
そのあとは、各頂点の色と頂点座標を次々に設定します。 ポリゴンはグーローシェーディングで描画されます。
座標系は、射影座標系(x、yが -1~1 の範囲)で指定します。
また、色の範囲も0~1.0になります。

■最後に

今回は、OpenGLでした。
OpenGL をやるつもりはまったくなかったのですが、Cg cording contest のNV30部門に応募するためには、OpenGLでないとだめなので、ちょいと勉強してみました。
簡単ですね。
ところで、GLUT って、みんな使ってるんですか?
OpenGL の文化はちょっとわからないので、まだまだ手探りです。





もどる

imagire@gmail.com