北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

OpenGLでテクスチャーの扱い方

手持ち無沙汰になったんで昔のアプリをいじってみました。


当初はPowerPCのG5で試してたんで全然FPS出なかったようですが、手持ちのMacBook Pro*1では普通に実用に堪えうるくらいのFPS出ました。ただ、このコード、明らかに駄目です。glBindTextureの使い方がわからなかったらしく、一切使わずにコメントアウトされてます*2


glBindTextureは、操作するテクスチャを指定するのに使います。多数のテクスチャを作る時にはとても役に立つ機能で*3、典型的な使い方としては、各テクスチャの初期化時に1回ずつ呼んで全部のテクスチャを初期化し、その後描画時に各テクスチャを貼るのに毎回利用するイメージです。

初期化は以下のような感じになります。使うテクスチャが決まった段階で、OpenGLに画像を仕掛けちゃいます。*4

	/* テクスチャ名(番号)を取得して、バインド */
	glGenTextures(1 , &texName);
	glBindTexture(GL_TEXTURE_2D , texName);

	/* このテクスチャの設定値 */		
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		
	/* イメージをセット */		
	glTexImage2D(
				 GL_TEXTURE_2D ,0 ,[bitmap hasAlpha] ? GL_RGBA : GL_RGB ,tex_size ,tex_size,
				 0, [bitmap hasAlpha] ? GL_RGBA : GL_RGB , GL_UNSIGNED_BYTE, texture_image
				 );

これだけ準備しとけば、描画のときは glBindTexture して glTexCoord2f するだけでよくなります。

	glBindTexture(GL_TEXTURE_2D , texName);
 
	//ポリゴンを書こう
	glBegin(GL_POLYGON);
		glTexCoord2f(0, 0);
		glVertex2f(-0.2, -0.2);
		glTexCoord2f(1, 0);
		glVertex2f( 0.2, -0.2);
		glTexCoord2f(1, 1);
		glVertex2f( 0.2,  0.2);
		glTexCoord2f(0, 1);
		glVertex2f(-0.2,  0.2);
	glEnd();


2005年に書いてたコードでは、glBindTextureの使い方がわかってなかったため、上記の初期化を描画の度に毎回してました。最悪(--;


いやー、それにしても、3年って月日で(何もしてなくても(爆))結構成長するもんですね〜。イベントループがシングルスレッドだとか、その辺の概念も3年の年月を経てわかったので、HTTPでサイトを読み込む処理もうまく最適化できる気がします。もうちょっといじってみようかな。

*1:初代のやつ

*2:via: 当時の記事

*3:サンプルアプリじゃない限りテクスチャ一つってことは皆無ですね

*4:glTexParameterf をバインドせずにグローバルで呼んでかなりハマりましたorz