OpenGLのGUIやらイベント処理をしてくれるライブラリとして、GLUTが最も有名です。しかし1998年以降開発が行われていないことから、古くさく感じたり、或いはglutMainLoop()関数を呼び出すと、二度と戻ってこれない仕様に泣かされたり、使い勝手が悪い面があります。
そこでこれに代わって「GLFW」というライブラリを導入してみました。勿論クロスフォーマットです。そして、何よりメインループを自分で作れるので、終了処理を色々施せます。ただ日本語のドキュメントがほとんど存在しないので、英語を自分で読まないといけないですorz
※ 実行環境GLFW 2.7.1
Windows 7 Home Premium 64bit SP1 + Visual C++ 2010 Express SP1
- 下記サイトから、ソースコードもしくはコンパイル済みのバイナリーをダウンロードしてきます。自分でビルドしたくない場合は、後者をダウンロードし、ステップ2、3をスキップして下さい。
https://www.glfw.org/ - ダウンロードしたやつを解凍し、「\glfw-2.7.1\support\msvc100\glfw.sln」を開きます(その他supportディレクトリにはVC2008用なんかもあるみたいです)。
- 何も考えずに「Debug」「Release」それぞれビルドします。「Permisson Deniedなんたら」とエラーが出たら、VCを管理者権限で起動したら解決しました。
- 吐き出された、もしくはダウンロードした「GLFW.dll」「GLFW.lib」「GLFWDLL.lib」をリンクして、「include\gl\glfw.h」をインクルードして準備は完了です。わたしは、プログラムファイルを触るのが好きではないので、作成するプログラムと同じディレクトリにコピーしました。うちの環境で、プログラムファイルにコピーするなら下記の通り。
- 「GLFW.dll」は「C:\Windows\SysWOW64\」にコピー
- 「GLFW.lib」「GLFWDLL.lib」は「C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib\」にコピー
- 「\include\GL\」にある「glfw.h」を「C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\gl\」にコピー
では実際に動かしてみます。
#include <gl/glfw.h> #pragma comment(lib , "opengl32.lib") #pragma comment(lib , "glfw.lib") //スタティックリンクの場合 #pragma comment(lib , "glfwdll.lib") //ダイナミックリンクの場合 int main(void) { int running = GL_TRUE; //GLFWの初期化 if(!glfwInit()) return 0; //ウィンドウを開く if(!glfwOpenWindow(300, 300, 0, 0, 0, 0, 8, 0, GLFW_WINDOW)) { glfwTerminate(); return 0; } //ウィンドウタイトルの設定 glfwSetWindowTitle("テスト"); glEnable(GL_DEPTH_TEST); while(running) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //描画 glBegin(GL_POLYGON); glColor3d(1.0, 0.0, 0.0); glVertex2d(-0.9, -0.9); glColor3d(0.0, 1.0, 0.0); glVertex2d(0.9, -0.9); glColor3d(0.0, 0.0, 1.0); glVertex2d(0.9, 0.9); glColor3d(1.0, 1.0, 0.0); glVertex2d(-0.9, 0.9); glEnd(); //ダブルバッファリングのバッファの交換 glfwSwapBuffers(); //ESCキーかXボタンで終了 running = !glfwGetKey(GLFW_KEY_ESC) && glfwGetWindowParam(GLFW_OPENED); } //終了処理 glfwTerminate(); return 0; }
4行目、5行目はお好きな方をどうぞ。ダイナミックリンクの場合は、実行ファイルと同一ディレクトリに「GLFW.dll」を置いておきます。
16行目: glfwOpenWindow(int width = 640, int height = 480, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode)
ウィンドウを開きます。witdthとheightはウィンドウサイズ。redbits、greenbits、bluebits、alphabitsはRGBAそれぞれに何ビット使用するか。depthbitsとstencilbitsは、デプスバッファとステンシルバッファに何ビット使用するか。それぞれ0を設定するとデフォルト値になるようですが、デフォルト値がなんなのかよく分からないですorz modeでウィンドウモードとフルスクリーンモード(GLFW_FULLSCREEN)を選択できます。
47行目の変数runningで終了判定をしています。ここを自由に設定できるのがいいですね-。
そして実行結果です。

また機会があれば(元気があれば?)ちゃんと3D描画してみます。