手持ち無沙汰になったんで昔のアプリをいじってみました。
当初は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でサイトを読み込む処理もうまく最適化できる気がします。もうちょっといじってみようかな。