ターミナルでちょこまかするのに飽きてきたので、お絵かきをしてみようといきなりOpenGLに飛びついた。ちょっと調べてみるとどうやらGLUT(The OpenGL Utility Toolkit)というやつを使うと便利らしい。
Mac OS Xの場合、個別にインストールしなくてもDeveloper Toolsに含まれていることがわかった。さっそくWindowを作ってみる。
- #include <cstdlib>
- #include <GLUT/glut.h>
- using namespace std;
- void display(void)
- {
- }
- int main(int argc, char* argv[], char* envp[])
- {
- glutInit(&argc, argv);
- glutCreateWindow(argv[0]);
- glutDisplayFunc(display);
- glutMainLoop();
- return EXIT_SUCCESS;
- }
どうもMac以外では「#include <GLUT/glut.h>」を「#include <GL/glut.h>」とすればいいらしい。ちなみに試してはいない。
- 流れとしては「glutinit」にコマンドライン引数をそのまま渡して初期化する。
- 「glutCreateWindow」でウィンドウを開く。引数はタイトルバーに表示される文字列らしい。
- 「glutDisplayFunc」に描画関数の関数ポインタを渡す。描画や再描画のタイミングでここでしてした関数が呼ばれるらしい。
- 「glutMainLoop」はイベントを待っているやつ。
また、ビルド時は「-framework」オプションが必要になる。
# g++ -o testGL testGL.cpp -framework GLUT -framework OpenGL
とするとOK。実行すると下のような味気ないWindowが表示される。
ただ、メイン関数内にglut〜、glut〜と書くのが、ごちゃごちゃしそうでいやなので、クラスにしてしまおうと改良してみた。そのソースは次の通り。
- #include <string>
- #include <cstdlib>
- #include <GLUT/glut.h>
- using namespace std;
- void display()
- {
- }
- class Window{
- private:
- string title_;
- public:
- Window(int argc, char* argv[], string title):
- title_(title)
- {
- glutInit(&argc, argv);
- glutCreateWindow(this->title_c_str());
- glutDisplayFunc(display);
- glutMainLoop();
- }
- ~Window(){}
- friend void display();
- };
- int main(int argc, char* argv[], char* envp[])
- {
- Window w(argc, argv, "Window Class Version");
- return EXIT_SUCCESS;
- }
基本的な処理は一緒だが、Windowクラス内にglut〜の処理を放り込んでいる。コンストラクタ内で処理を行っているのがいけてないとは思う。また、描画関数をメンバに加えると、どうしてもうまく関数ポインタで渡せなかったので、フレンド関数としている。ここもなんだかいけてない。ちなみに実行したところは下のような感じ。
あいかわらず味気ない。一応ウインドウのタイトルにメンバ変数が反映されているのがわかる。
次はウインドウ内に描画しようと思うが、長くなってきたので次回に続く。