今回は、いよいよテクスチャマップをしてみます。sample08.cだけでなく、ppmread.c、ppmread.h、texture1.ppmもいっしょにダウンロードしてください。
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を指定します。
void glTexParameteri(GLenum target, GLenum pname, GLint param)
テクスチャの張り方を設定します。void glTexCoord2f(GLfloat s, GLfloat t)
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_TEXTURE_MIN_FILTERは、テクスチャが縮小されて張られるときの設定です。paramは、GL_NEARESTかGL_LINEARのどちらかです。(ミップマップの設定があと4つあるが、今回は使わない)
GL_TEXTURE_WRAP_SとGL_TEXTURE_WRAP_Tは、テクスチャの横方向と縦方向に対して、それぞれテクスチャが繰り返されるかどうかを設定します。下図の様な感じです。
GL_CLAMP GL_REPEAT
テクスチャ上での座標を指定します。上の図のように、GL_REPEATの時は、2.0など[0.0 , 1.0]の外の値も指定することもできます。