サンプル8


  今回は、いよいよテクスチャマップをしてみます。sample08.cだけでなく、ppmread.c、ppmread.h、texture1.ppmもいっしょにダウンロードしてください。


目次

テクスチャの読み込み

  サンプルプログラムを見てみます。まず、最初にppmread.cの方です。OpenGLのテクスチャに直接関係のあるのは、ReadPPMTexture()の中の、glGenTextures()、glBindTexture()、glTexImage2D()の3つの関数です。
(注)今回は、ReadPPMMipmap()は使いません。ミップマップは次回、解説します。

void glGenTextures(GLsizei n, GLuint *textures)

  OpenGLでは、テクスチャにそれぞれ番号をつけて、テクスチャを管理します。glGenTextures()は、その番号を取得する関数です。nには、取得したい数を入れ、texturesには、配列を入れます。そうすると、配列に番号が返ってくるので、この番号をテクスチャ用番号として使います。
void glBindTexture(GLenum target, GLuint texture)
  使うテクスチャを選択します。targetは、GL_TEXTURE_1DもしくはGL_TEXTURE_2Dです。textureには、使おうとするテクスチャの番号を渡します。
void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
  2次元テクスチャをつくります。
  targetには、GL_TEXTURE_2Dを入れます。ミップマップを作るときなどは、GL_PROXY_TEXTURE_2Dを入れることもありますが、普通は使いません。
  levelも、普通は0です。自分でミップマップを作る場合は、1以上の値を入れます。
  internalformatは、GL_RGBかGL_RGBAでいいでしょう。
  widthとheightは、テクスチャマップの幅と高さです。OpenGLでは、テクスチャの大きさは、2の累乗である必要があります。すなわち、1、2、4、8、16、32、64、128、256・・・のうちのどれかです。規格上は最低でも64x64の大きさのテクスチャがサポートされ、実際には、1024x1024ぐらいはサポートされています。
  borderは、テクスチャに枠をつけるなら1を指定するらしいです。普通は0。
  formatは、pixelsに渡すデータの形式です。PPMは、RGB形式で記録されているので、GL_RGBを指定します。もし、PNGなどのフォーマットで透明度設定もあれば、GL_RGBAを指定すれば良いでしょう。
  typeには、pixelsに渡すデータの型を指定します。PPMは各色8ビットなので、GL_UNSIGNED_BYTEを指定します。もし、PNGなどで、リッチにも各色16ビットだったりすれば、GL_UNSIGNED_SHORTを指定します。

テクスチャを張る

  テクスチャを読み込むには、上の3つでOKです。次に、ポリゴンにテクスチャを張る方法を見てみます。sample08.cのdisplay_func()の中を見てください。
  大まかな流れは、まず、glEnable(GL_TEXTURE_2D)を呼んで、テクスチャを使うようにします。次に、テクスチャの張り方を、glTexParameteri()を使って設定し、それから、glBindTexture()を呼んで、張り付けるテクスチャを選択します。最後にポリゴンを描くときに、頂点を指定する前に、その頂点がテクスチャのどの点に対応するかをglTexCoord2f()で指定します。これでテクスチャが張られたポリゴンを描くことができます。
  では、それぞれの関数をみてみましょう。

void glTexParameteri(GLenum target, GLenum pname, GLint param)

  テクスチャの張り方を設定します。
  targetは、GL_TEXTURE_1DもしくはGL_TEXTURE_2Dです。
  pnameには、どのパラメタを設定するかを指定します。GL_TEXTURE_MIN_FILTER、
GL_TEXTURE_MAG_FILTER、GL_TEXTURE_WRAP_S、GL_TEXTURE_WRAP_T、GL_TEXTURE_PRIORITYのうちのどれかです。
  GL_TEXTURE_MAG_FILTERは、テクスチャが拡大されて張られるときの設定です。paramは、GL_NEARESTかGL_LINEARのどちらかです。テクスチャを張ったとき、テクスチャのピクセルとピクセルの間の色が必要になりますが、この時に、GL_NEARESTを指定すると、一番近いピクセルの色を使います。たとえば、(1.3,1.0)の色が欲しいときは、(1,1)の色を使います。GL_LINEARの場合は、周りの色を補完して色を求めます。もし、(1.3,1.0)の色が必要なら、(1,1)と(2,1)の色を合成して求めます。イメージとしては、次の様な感じです。
 
GL_NEAREST
GL_LINEAR
GL_NEAREST GL_LINEAR

  GL_TEXTURE_MIN_FILTERは、テクスチャが縮小されて張られるときの設定です。paramは、GL_NEARESTかGL_LINEARのどちらかです。(ミップマップの設定があと4つあるが、今回は使わない)
  GL_TEXTURE_WRAP_SとGL_TEXTURE_WRAP_Tは、テクスチャの横方向と縦方向に対して、それぞれテクスチャが繰り返されるかどうかを設定します。下図の様な感じです。
 

GL_CLAMP
GL_REPEAT
GL_CLAMP GL_REPEAT
void glTexCoord2f(GLfloat s, GLfloat t)
  テクスチャ上での座標を指定します。上の図のように、GL_REPEATの時は、2.0など[0.0 , 1.0]の外の値も指定することもできます。

戻る