0

ゲームにフロアがあり、100x100 のクワッドで構成されています。ライティングが台無しになるので、クワッド 1 つだけではできませんでした。そして、ここに問題があります - それらすべてに単一のテクスチャを配置するにはどうすればよいですか? このコードは各クワッドにテクスチャを配置しますが、これは私が望む効果ではありません。

glBegin(GL_QUADS);
glNormal3f(0,0,1);

for(float j = 0; j < 1; j+=0.01)
{       
      for(float i = 0; i < 1; i+=0.01)
    {           
        glTexCoord2f(0.0,0.0); glVertex2f(i,j+0.01);
        glTexCoord2f(1.0,0.0); glVertex2f(i,j);
        glTexCoord2f(1.0,1.0); glVertex2f(i+0.01,j);
        glTexCoord2f(0.0,1.0); glVertex2f(i+0.01,j+0.01);
    }

}
glEnd();
glPopMatrix();
4

3 に答える 3

0

手っ取り早い解決策は、床の場合と同じ値をテクスチャ座標に使用することです。

glTexCoord2f(i, j+0.01);      glVertex2f(i, j+0.01);
glTexCoord2f(i, j);           glVertex2f(i, j);
glTexCoord2f(i+0.01, j);      glVertex2f(i+0.01, j);
glTexCoord2f(i+0.01, j+0.01); glVertex2f(i+0.01, j+0.01);
于 2013-02-02T19:33:31.403 に答える
0

古いバージョンの OpenGL を使用しているように見えるため、使用できない可能性がありますが、カスタム フラグメント シェーダーを使用すると問題が解決します。それが私がすることです。しかし、あなたが探しているのは、UV 座標を補間する必要があるだけだと思います。たとえば、4 つの正方形がある場合、代わりに

0.0f,0.0f
1.0f,0.0f
1.0f,1.0f
0.0f,1.0f

最初は

0.0f,0.0f
.5f,0.0f
.5f,.5f
.0f,.5f

また、より予測可能な動作のためにforループで整数を使用しますが、頂点の位置をインデックスに計算する方法を適応させることができます。

    glTexCoord2f(i,j); glVertex2f(i,j+0.01);
    glTexCoord2f(i+.01,j); glVertex2f(i,j);
    glTexCoord2f(i+.01,j+.01); glVertex2f(i+0.01,j);
    glTexCoord2f(i,j+.01); glVertex2f(i+0.01,j+0.01);

tex 座標の順序に注意してください。

于 2013-02-02T19:39:05.177 に答える
-1

ライティングが台無しになるので、クワッド 1 つだけではできませんでした。

これが、ピクセルごとの照明のすべてです。頂点でのみ照明の色を評価し、三角形全体を補間する頂点単位の照明は、フロアの場合のように、三角形がライトまでの距離に比べてかなり大きい場合、結果が悪くなります。ピクセル単位のライティングを使用する場合は、独自のフラグメント シェーダーを作成する必要がありますが、フロア全体にクワッドを 1 つだけ使用すれば、ライトがどれだけ近くても遠くてもライティングは正しくなります。

参照: http://www.swiftless.com/tutorials/glsl/5_lighting_perpixel.htmlhttp://en.wikipedia.org/wiki/Per-pixel_lighting

于 2013-02-02T19:40:43.007 に答える