テクスチャ

2010年1月7日

ファイル

22-texture.tar.gz

内容

面にテクスチャを貼ってみます。以下の部分でテクスチャファイルを読み込みます。

	texture = loadTexture(TEXTURE_FILE, &w, &h, &info);
	checkLoadTexture(info);

テクスチャファイルは raw PPM ファイルです。PPM ファイルは Irfan View などで作成できます。PPM ファイルは、"P6" から始まり、幅と高さが書かれている行が続き (ただし間に "#" から始まるコメント行を挟める)、色数の行があり、その下に RGB のデータが続きます。テクスチャデータとしての制約で、幅と高さは共に 2 の累乗である必要があります (256x256 とか)。

以下ではテクスチャを貼るための準備をしています。

	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
	glGenTextures(1, &textureID);
	glBindTexture(GL_TEXTURE_2D, textureID);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0,
	  GL_RGB, GL_UNSIGNED_BYTE, texture);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
	glEnable(GL_TEXTURE_2D);

glGenTextures() で、テクスチャの ID を取得します。次に glBindTexture() で ID を指定してテクスチャオブジェクトを作成します。glTexImage2D() でテクスチャイメージを指定しています。

glTexParameterf() ではテクスチャの貼り方の設定をしています。GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T はそれぞれテクスチャ座標の s, t に関する指定で、GL_REPEAT か GL_CLAMP を指定します。GL_REPEAT はテクスチャを反復して貼り付け、GL_CLAMP ははみ出た部分を引き伸ばします。GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MIN_FILTER はそれぞれ拡大・縮小されたときのフィルタ処理の指定で、GL_LINEAR と GL_NEAREST を指定できます。

glTexEnvf() はテクスチャと面の地の色との混合に関する処理の指定です。上記では地の色を無視するように指定しています。GL_DECAL の他に GL_BLEND などを選択することで混合を考慮したりできます。

最後の行でテクスチャ機能を有効にしています。

実際に貼り付けるときは、改めて glBindTexture() を呼びます。

	glBindTexture(GL_TEXTURE_2D, textureID);

面を描くとき、glTextCoord2f() で頂点にテクスチャ座標を設定します。

	glBegin(GL_QUADS);
	glTexCoord2f(0., 2.);
	glVertex2f(-0.5, -0.5);
	glTexCoord2f(2., 2.);
	glVertex2f(0.5, -0.5);
	glTexCoord2f(2., 0.);
	glVertex2f(0.5, 0.5);
	glTexCoord2f(0., 0.);
	glVertex2f(-0.5, 0.5);
	glEnd();

テクスチャ座標はテクスチャの左上が原点で下向きが正になっています。値は 1 が最大です。2 という値を設定しているということは、テクスチャをはみ出しているということですが、glTexParameterf() の設定で、はみ出したらテクスチャを繰り返すように設定しているので、ここでは 2 回テクスチャを繰り返すことになります。ということで、2 x 2 の 4 回テクスチャが貼られます。

OpenGL プログラミング 目次へ