従って、OpenGLにおけるコマンドの使用法は次の2つに大別できることになる。
Display Listを用いれば、同じオブジェクトを何回も描画する際などに、 何度もその場で形状を定義するよりは効率を向上させられる可能性がある。 また、OpenGLプログラムをネットワークを介して別マシン上で実行する場合など は有効である。 以下ではdisplay listについて簡単な例を紹介する。
gcc -o rect04 rect04.c -L/usr/X11R6/lib -lglut -lGLU -lGL -lXmu -lXext -lXt -lX11 -lm
または
gcc -o rect04-dl rect04-dl.c -L/usr/X11R6/lib -lglut -lGLU -lGL -lXmu -lXext -lXt -lX11 -lmWindows(Cygwin), Macの場合はこちらを参照
% ./rect04 (または ./rect04-dl)
四角形はz=0で定義して、glTranslatefによって各々の適切な位置に配置するこ とにすると、例えば以下のようにすればよい。
glPushMatrix(); glColor3f(1.0, 0.0, 0.0); glTranslatef(-0.8, 0.5, -3.5); glBegin(GL_POLYGON); glVertex3f(-1.0, -1.0, 0.0); glVertex3f(1.0, -1.0, 0.0); glVertex3f(1.0, 1.0, 0.0); glVertex3f(-1.0, 1.0, 0.0); glEnd(); glPopMatrix(); glPushMatrix(); glColor3f(0.0, 1.0, 0.0); glTranslatef(0.0, 0.0, -3.0); glBegin(GL_POLYGON); glVertex3f(-1.0, -1.0, 0.0); glVertex3f(1.0, -1.0, 0.0); glVertex3f(1.0, 1.0, 0.0); glVertex3f(-1.0, 1.0, 0.0); glEnd(); glPopMatrix(); glPushMatrix(); glColor3f(0.0, 0.0, 1.0); glTranslatef(0.8, -0.5, -2.5); glBegin(GL_POLYGON); glVertex3f(-1.0, -1.0, 0.0); glVertex3f(1.0, -1.0, 0.0); glVertex3f(1.0, 1.0, 0.0); glVertex3f(-1.0, 1.0, 0.0); glEnd(); glPopMatrix();この例では四角形を定義するコマンドが繰り返し用いられている。このような繰 り返して用いられる描画コマンドはこれをディスプレイリストに保存しておき、 これを呼び出して使用することもできる。
各ディスプレイリストには識別のために整数値が与えられる。 描画コマンドをディスプレイリストに保持するためには、まず 未使用のディスプレイリスト用の識別値(整数)を確保し、次いで 各ディスプレイリストに対応する描画コマンドを指定していけばよい。
新規にディスプレイリストを確保するためには、関数glGenListsを用いればよい。
glGenLists(GLsizei range);glGenListsは引数を1つ持ち、これは新規に確保したいディスプレイリストの個 数を表す。 指定した個数の確保に成功した場合、この関数は使用可能なディスプ レイリストの識別に用いる連続した整数値を指定個数確保し、その先頭の整数値 (最小整数値)を返す。
これらの数値を用いてディスプレイリストを指定することができる。 各ディスプレイリストに保持する描画コマンドを指定するためには
glNewList(listIndex, GL_COMPILE); /* listIndexはディスプレイリストを指定する整数値 */ ....描画コマンド指定 .... glEndList();と、glNewList~glEndListの間に描画コマンドを指定すればよい。 例えば、M個のディスプレイリストを確保して描画コマンドを リストに保持するには以下のようにすればよい。
GLuint listName; .... listName = glGenLists(M); .... glNewList(listName, GL_COMPILE); 1番目のオブジェクトの定義 glEndList(); .... glNewList(listName+M-1, GL_COMPILE); M番目のオブジェクトの定義 glEndList();これにより、M個のディスプレイリストが生成される。 ディスプレイリストにはそれが生成されたときに有効であった パラメータ値が保持される。 描画時に保持した描画コマンドを用いるにはglCallListによって ディスプレイリストを呼び出せばよい。
glCallList(listIndex); /* listIndexはディスプレイリストを表す整数値 */この3つの四角形を表示するプログラムの場合、 四角形の形は同じであるので、形状を定義するコマンドを 描画リストに保持している。 このためにinit関数において以下のような処理を行っている。
void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); ListName = glGenLists(1); glNewList(ListName, GL_COMPILE); glBegin(GL_POLYGON); glVertex3f(-1.0, -1.0, 0.0); glVertex3f(1.0, -1.0, 0.0); glVertex3f(1.0, 1.0, 0.0); glVertex3f(-1.0, 1.0, 0.0); glEnd(); glEndList(); }この場合、使用するディスプレイリストは1つだけであるので、 glGenLists(1);により、リストを表す整数値を得てListNameに 入れている。その後、四角形を定義するコマンドをこのリストに保持している。 描画には、このリストCallListによって呼び出して用いることにより 3つの四角形を描画できる。描画を行う関数display中の対応部分は 以下のようになる。
glPushMatrix(); glColor3f(1.0, 0.0, 0.0); glTranslatef(-0.8, 0.5, -3.5); glCallList(ListName); glPopMatrix(); glPushMatrix(); glColor3f(0.0, 1.0, 0.0); glTranslatef(0.0, 0.0, -3.0); glCallList(ListName); glPopMatrix(); glPushMatrix(); glColor3f(0.0, 0.0, 1.0); glTranslatef(0.8, -0.5, -2.5); glCallList(ListName); glPopMatrix();