OpenGL:テクスチャ座標の自動生成(あんまりおすすめじゃない)

本物のページはこちら→texture-gen

Included page "opengl:texture-gen" does not exist (create it now)

texgen.PNG

テクスチャ座標指定するのって面倒くさい。
はしっこと端っこの座標与えたら勝手に計算してくれればいいのに!
と思ってので、調べてみる。

結論

平行移動ができないという致命的な欠点がある。
こんなことやるくらいだったらシェーダでやったほうが頭がすっきりするし、計算も速そう
こんなふうにね

gl_TexCoord[0]=(gl_Vertex+好きな平行移動)*好きな拡大縮小;

初期設定

glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);

GL_OBJECT_LINEARにすると、モデルに沿った座標系で計算する。つまり、ローカル座標系ということ。
次にテクスチャ生成関数のパラメータを渡す。
double genfunc[][4] = {   //テクスチャ生成関数のパラメータ
            { 0.5, 0.0, 0.0, 0.0 },//Sに渡す。0.0-2.0の範囲の画像に渡すなら÷2
            { 0.0, 0.5, 0.0, 0.0 },//Tに渡す
        };
glTexGendv(GL_S, GL_OBJECT_PLANE, genfunc[0]);        
glTexGendv(GL_T, GL_OBJECT_PLANE, genfunc[1]);

これはどういうことかというと
この配列で渡したパラメータは、次のように頂点座標と掛け算されるのだ。(1)
\begin{equation} できたテクスチャ座標=p_{1}x+p_{2}y+p_{3}z+p_{4}w \end{equation}

x,y,z,wがglVertex()で渡す頂点の座標
p0..p4は上の配列でいうところのgenfunc,つまりテクスチャ生成関数のパラメータとして渡した値。
なので、もしこういう四角形を書いたならば

glBegin(GL_QUADS);
        glVertex3d(0,0,0.0);
        glVertex3d(2.0,-0,0.0);
        glVertex3d(2.0,2.0,0.0);
        glVertex3d(0,2.0,0.0);
        glEnd();

こういうパラメータにすれば、
double genfunc[][4] = {   //テクスチャ生成関数のパラメータ
            { 0.5, 0.0, 0.0, 0.0 },//Sに渡す。0.0-2.0の範囲の画像に渡すなら÷2
            { 0.0, 0.5, 0.0, 0.0 },//Tに渡す
        };

0.0×0.5=0.0,2.0×0.5=1.0だから
無事、端から端が0.0-1.0になってうまく絵になるのだ。
texgen.PNG

マイナスからプラスにまたがる座標の場合。。。?

こういう座標の四角形にテクスチャをあてがいたい場合

glBegin(GL_QUADS);
        glVertex3d(-0.5,-0.5,0.0);
        glVertex3d(0.5,-0.5,0.0);
        glVertex3d(0.5,0.5,0.0);
        glVertex3d(-0.5,0.5,0.0);
        glEnd();

。。。どうしよう、テクスチャ生成関数には平行移動がなくない!!??
とりあえず、長さだけ合わせてやってみるか
static double genfunc[][4] = {   //テクスチャ生成関数のパラメータ
            { 1.0, 0.0, 0.0, 0.0 },//Sに渡す。0.0-2.0の範囲の画像に渡すなら÷2
            { 0.0, 1.0, 0.0, 0.0 },//Tに渡す
        };

するとやっぱり、こんなふうに変になってしまうのです。
strange.png
うーん、こうなるとシェーダを使ってテクスチャ座標をずらすしかないのかなぁ。
フルソースコード

サポートサイト Wikidot.com