サンプル5


  今回は、OpenGLのリストという機能を使ってみます。


目次

サンプルプログラム

  言葉だけでリストの説明をするのは難しいので、先にサンプルプログラムを見てみましょう。
  リストに関係のある関数は、make_list()の中の、glGenLists()、glNewList()、glEndList()、それから、display_func()の中のglCallList()の4つです。
  どんなものかというと、glNewList()と、glEndList()の間の描画関数が、glCallList()を呼んだときに実行されるというものです。やっていることは簡単なので、関数の説明をします。

GLuint glGenLists(GLsizei range)

  新しいリスト識別番号を取得します。rangeには、取得したい個数をいれます。返値、返値+1、・・・返値+range-1までの値を新しい識別番号として使えます。


void glNewList(GLuint list, GLenum mode)
void glEndList(void)

   glNewList()とglEndList()の間に書いた描画関数が、リスト内容になります。listには、glGenLists()で取得した識別番号を入れます。modeは、GL_COMPILEもしくは、GL_COMPILE_AND_EXECUTEのどちらかで、GL_COMPILEを指定すると、描画関数はリスト内容になるだけですが、GL_COMPILE_AND_EXECUTEを指定すると、リスト内容になるとともに、画面への描画も同時に行われます。


void glCallList(GLuint list)

  リスト内容を描画します。listには、リストの識別番号を入れてください。

なぜリストを使うのか

  別にわざわざリストを使わなくても、glNewList()からglEndList()の間を1つの関数にして、glCallList()の代わりにその関数を呼べばいいじゃないかと思う方もいるでしょう。実際に試してみればわかるように、全く同じように表示されます。それなら、リストはなくてもいいようにも思えます。
 でも、リストを使うと1つだけいいことがあります。それは、ちょっぴり速くなるということです。関数を何度も呼ぶと、そのたびにメモリ間でコピーが生じたりと幾らかオーバーへッドがあります。また、UNIXでネットワーク越しにプログラムを動かしていると、glVertex()などを呼ぶたびにネットワーク上をデータが飛んでいきます。しかし、リストを使うと、このようなオーバーへッドがなくなってちょっぴり速くなるのです。


  今回は、リストという外から見たらわからない地味なものですが、ゲームなど少しでも速くしたいときには、リストを使ったりするでしょう。そのときのために、こういうものがあることだけは知っておいてください。


戻る