簡単なOpenGLプログラム例―その1
「簡単なOpenGLプログラム例」で説明した準備の後、以下で説明するようにプログラムを書いて実行すると図1の画面が表示される。
図1
図1の描画用ウィンドウは下記のコードによって設定することができる。
::glutInitWindowSize(500,
500); // OpenGL用のウィンドウのサイズ
::glutInitDisplayMode(GLUT_RGB); // ディスプレイモードの設定
::glutCreateWindow("Draw Circle"); // OpenGL用ウィンドウの作成表示
実際の描画は、呼び出されると画面右上角のX印がクリックされるまで実行状態が続く関数glutMainLoop
::glutMainLoop(); // OpenGLのプログラム実行中は、このループ関数が実行中状態になる
の呼び出しによって実行される関数によって行われる。この描画用関数は関数glutDisplayFuncによって以下のように設定する。
::glutDisplayFunc(display); // 下のglutMainLoopに入ったときに呼び出される関数名の登録
この描画用関数は値がvoid、パラメータもvoidである。プログラム例における描画用関数は以下のようになっている。
void display(){
::glClear(GL_COLOR_BUFFER_BIT); // カラーバッファの初期化
::glColor3f(0.0,
1.0, 1.0); // カラーの設定(R, G, B)
::glBegin(GL_TRIANGLES); // 3角形の描画
::glVertex2f(-0.5,
-0.4);
::glVertex2f(
0.5, -0.4);
::glVertex2f(
0.0, 0.4);
::glEnd();
::glFlush(); // OpenGLのコマンドの実行
}
カラーバッファの初期化と色の設定を行った後、3角形の描画を行っている。頂点の座標はglVertex2fによって設定されているが、この座標系は描画画面の左下が(-1.0, -1.0)、右上が(1.0, 1.0)である。
実際の描画は、関数glFlushの呼び出しによって実行される。
なお、関数名の前に「::」が付いているが、これは不要である。しかし、「::」を付けると、コーディング時にコード支援機能が働いて途中まで打ち込んだ文字列に対応する候補が表示される(図2)ので、便利である。
図2
該当する名前にマークを設定して(クリックあるは矢印キーで行える)Enterキーを押すとエディタに入力される。ただし、定数名などをこの方法で入力したときはコンパイル(ビルド)前に「::」を削除しておく。これらの名前の先頭につく「::」は大域的名前空間を表わすものであるが、<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房>のp.145などに解説がある。
図1の描画を行うプログラムは以下のようである。
===========================================
#include "stdafx.h"
#include <glut.h>
void display(){
::glClear(GL_COLOR_BUFFER_BIT); // カラーバッファの初期化
::glColor3f(0.0,
1.0, 1.0); // カラーの設定(R, G, B)
::glBegin(GL_TRIANGLES); // 3角形の描画
::glVertex2f(-0.5,
-0.4);
::glVertex2f(
0.5, -0.4);
::glVertex2f(
0.0, 0.4);
::glEnd();
::glFlush(); // OpenGLのコマンドの実行
}
int _tmain(int argc, char *
argv[]) // 2番目のパラメータの型を「char *」と変更する。
{
::glutInit(&argc,
argv); // 初期化
::glutInitWindowSize(500,
500); // OpenGL用のウィンドウのサイズ
::glutInitDisplayMode(GLUT_RGB); // ディスプレイモードの設定
::glutCreateWindow("Draw Circle"); // OpenGL用ウィンドウの作成表示
::glutDisplayFunc(display); // 下のglutMainLoopに入ったときに呼び出される関数名の登録
::glClearColor(1.0,
1.0, 0.0, 1.0); // OpenGL用ウィンドウの色(R, G, B, Alpha); Alpha=0.0としておく
::glutMainLoop(); // OpenGLのプログラム実行中は、このループ関数が実行中状態になる
return 0;
}
===========================================
先頭の
#include "stdafx.h"
は、Visual C++が自動的に用意するもので、これを削除するとエラーになる。
初期化関数glutInitの2つのパラメータはメインの関数
int _tmain(int argc, char * argv[])
における2つのパラメータが用いられている。
関数glutMainLoopの実行において関数glutDisplayFuncによって指定された関数displayが呼び出されて描画が行われる。glutMainLoopは描画画面の右上角のX印(図1)がクリックされるまで実行中の状態となる。X印がクリックされるとglutMainLoopの実行終了となり、プログラムの実行が終了する。
上のプログラムを少し変更して図3のような描画を行う例を「簡単なOpenGLプログラム例ーその2」で説明する。
図3