トップコンテンツプログラムノベルゲーム>ウィンドウ(OpenGL編)



ウィンドウ(OpenGL編)

どこのサイトでも、初めてのコマンドラインプログラムは「Hello 〇〇!!」, GUI プログラムの場合はウィンドウの作成。
「なぜ?」と聞かれると少し困りますが、プログラムの内容自体が簡単, 結果が分かりやすい形で眼に見える、という2つの理由だと“自分”は考えています。

では本題に。
ライブラリの導入のページでも軽く書きましたが、このページでは OpenGL の学習用に「GLUT」を使います。
まず、OpenGL 用の関数には、使用するライブラリごとに関数名の先頭に特徴があります。
このサイトでは3種類だけ登場すると思います

  1. 先頭が gl…… となっている OpenGL ライブラリ関数。これが OpenGL 関数の基礎。
  2. 先頭が glu…… となっている OpenGL ユーティリティ関数。gl 関数よりも少し高水準な関数セットで、例えば曲面を描画する関数などがある。
  3. 先頭が glut…… となっている OpenGL ユーティリティツールキット関数。主に GUI プログラムをつくるための設定を行なう関数(ウィンドウを作ったり)のライブラリ。

ただ、GLUT はそれなりに簡単にマルチプラットフォームの GUI プログラムが作れる代わりに、
どの OS にも共通するような機能だけが用意されているため、「この機能が欲しいな……」と
思っても GLUT のライブラリには用意されていないことが多々あります。

そのため、“自分”の場合は完成版のプログラムに GLUT を使いません。
なので、GLUT については出来るだけ深い部分には踏み込まないようにはします。
glut 関数については、解説を読まずにコピペしても OK と思う。

インクルードするヘッダは、glut.h のみ。
普通は GL フォルダに入っていると思うので、GL フォルダをインクルード対象として登録しておき、GL/glut.h をインクルードすれば OK です。
gcc を使うなら makefile を書いておけば楽でしょう。
ただし、Mac OS X の場合は少し違うので、こちらの解説を見てください。
※ ちなみに glut.h の中では、 gl.h, glu.h という、gl 関数, glu 関数のライブラリを使うのに必要なヘッダファイルが既にインクルードされているので、glut.h だけで済むわけです。

ついでに注意。
OpenGL, GLUT の関数は C 言語で書かれているので、引数に関数を渡す場合、渡す側の関数が引数を取らないなら、宣言の部分できちんと「void」を明記する必要があります。C++ に慣れてしまった人は注意。


プログラム その1

それでは、最初はウィンドウを生成するだけのプログラムのコードを。


gl1_1.c (空ウィンドウを表示するだけ) [表示・非表示]
 1.
 2.
 3.
 4.
 5.
 6.
 7.
 8.
 9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
#include <GL/glut.h>

/* ディスプレイへの描画処理について記述 */
void display(void)
{
  /* とりあえず今は空 */
}

/* 個々のプログラム独自に行なうべき初期化 */
void myInit(void)
{
  glutCreateWindow("OpenGL"); // ウィンドウの生成
  glutDisplayFunc(display);   // 画面描画関数(自分自身で定義)をイベントとして登録
}


int main(int argc, char* argv[])
{
  /* 初期化 */
  glutInit(&argc, argv);  // GLUT 関数を使用するための初期化
  myInit();               // プログラマ定義の初期化

  /* イベント待機状態に入る */
  glutMainLoop();         // イベント待ち状態に入る

  return 0;
}

実行結果はこちら
ウィンドウ その1


myInit の内容を main 関数に直接書けばコードの量は少し減らせますが、後々のプログラムで myInit のところに色々な設定を記述するため、蛇足かもしれませんが myInit 関数を記述しています。
さて、太字で示した関数の解説でも。



どんなプログラムでも、上に挙げた 5 つの関数は使うと思うので覚えておくと楽かもです。コピペでもいいですが。


プログラム その2

これだけでは寂しいので、もう少しいろいろな設定を加えてみましょうか。というか gl 関数、まだ紹介してないし
今度はウィンドウサイズやウィンドウの背景色を決めたりもしてみましょう。
なお、ページの1番最初のソースコードは基本的に全文を貼りますが、それ以降のプログラムコードについては、変更した部分のみを書くようにします。


gl1_2.c (ウィンドウを表示するだけだが、少し設定を加えてみる) [表示・非表示]
 1.
 2.
 3.
 4.
 5.
 6.
 7.
 8.
 9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26. 
~インクルードファイル 変更なし~

/* ディスプレイへの描画処理について記述 */
void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT);       // OpenGL が使用するバッファのクリア

  glClearColor(0.0, 0.0, 1.0, 1.0);   // ウィンドウの背景色(画面消去色)を青に設定

  glutSwapBuffers();                   // バッファの入れ替え
}

/* 個々のプログラム独自に行なうべき初期化 */
void myInit(void)
{
  /* ウィンドウ生成前に行なうべき設定 */
  glutInitWindowSize(800, 600);                   // ウィンドウサイズの設定
  glutInitWindowPosition(200, 200);              // 表示位置の設定
  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); // ディスプレイモードの設定
  glutCreateWindow("OpenGL");                        // ウィンドウを生成

  /* イベント発生時に呼び出される関数の登録 */
  glutDisplayFunc(display);  // 画面描画関数を登録
}

~main 関数 変更なし~

実行結果はこちら。
ウィンドウ その2



ようやく gl 関数も 2 つほど出てきました。
とは言え、これからは基本的に gl 関数のみを紹介していくことになります。
もちろん必要あるときには glut 関数を紹介しますが、最終的には GLUT を使わないので、あまり覚える必要はない。
この先、立方体の表示や, アニメーションのデバッグをしたい時なんかに紹介するかも。
長くなりましたが、最後にこのページで登場した OpenGL 関数の一覧を。



2. 図形の表示へ