気分を変えてOpenGLです。
簡単なポリゴンを表示するプログラムをつくって見ました。
まぁ、いつものように適当にファイルが入っています。
main.cpp | これだけ。 |
あと、実行ファイル及び、プロジェクトファイルが入っています。
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 の面倒な部分を隠蔽してくれます。
OpenGL 自体は、Windows でサポートされているので、問題はないのですが、
GLUTは自分でインストールする必要があります。
Nate Robins 氏の Web サイトから、ダウンロードしてください。私がダウンロードした場合には、glut-3.7.6-bin.zip が最新でした。
ファイルと解凍すると、いくつかファイルがあります。
次のファイルを、それぞれの位置にコピーします。
glut.h | VCのインクルードファイルが置いてある場所 | C:\Program Files\Microsoft Visual Studio\VC98\Include\GL とか |
glut32.lib | VCのライブラリが置いてある場所 | C:\Program Files\Microsoft Visual Studio\VC98\Lib とか |
glut32.dll | DLL が置いてある場所 | 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 の文化はちょっとわからないので、まだまだ手探りです。