OpenGLでテクスチャを張るとき、テクスチャの初期化時に
glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
と書いて、描画時に
glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T);
と書くと、基本的にテクスチャを自動生成してくれるわけですが(参考サイト:
床井研究室「第5回」, 床井研究室「第10回」)、
これだと、テクスチャがオブジェクトにはりついてくれていないので、球を回転させてもテクスチャが動いてくれないわけです。
このやり方はそもそも、glutSolidSphereがテクスチャ座標を生成してくれていないので、「自動生成」に頼るということなのですが、
gluSphereにはテクスチャ座標の生成がちゃんとあるので、それを使えばちゃんとテクスチャが晴れるわけです。
GLUquadricObj*の宣言
GLUquadricObj* _sphere;
に対し、
_sphere = gluNewQuadric(); gluQuadricDrawStyle(_sphere, GLU_FILL); gluQuadricNormals(_sphere, GLU_SMOOTH); gluQuadricTexture(_sphere, GL_TRUE);
と、パラメータを設定。重要なのはgluQuadricTexture。ここで、GL_TRUEを設定することで、テクスチャ座標がちゃんと生成されます。
描画時には
glEnable(GL_TEXTURE_2D); gluSphere(_sphere, 1.0, 32, 32);
とすればいいわけです。このとき、gluSphereが作ってくれるテクスチャ座標をさっきのテクスチャ自動生成が上書きしちゃわないように、glTexGeniやglEnable(GL_TEXTURE_GEN_S/T)はコメントアウト(というか削除)しておく必要があります。
テクスチャの生成やバインドはglGenTexturesやglBindTextureでふつうにやればOKです。
このときのテクスチャは作ったテクスチャに対して、photoshopなんかで「フィルタ」>「極座標変換」を選んで、極座標から直交座標へ変換を行って作りましょう。
で、個人的にはマルチテクスチャを球に張りたいのですが、さすがにマルチテクスチャ座標をgluQuadricが生成してくれそうにないんで、困ってます(笑)
さすがに自分で作りますかねぇw