1

これは私が直面している大きな問題です。

glTranslate を使用して複数のタイルをレンダリングしようとしていますが、x、y 座標で描画関数を呼び出すと、タイルの間隔が奇妙になります (スペースは必要ありません)。

これが何が起こるかです。

複数のタイルを描画するが問題がある

ここに私のコードがあります:

描く:

public void draw(float Xa, float Ya) {

    GL11.glTranslatef(Xa, Ya, 0);


    if(hasTexture) {
    Texture.bind();

    GL11.glBegin(GL11.GL_QUADS);
        GL11.glColor3f(0.5f, 0.5f, 1);
        GL11.glTexCoord2f(0, 0);
        GL11.glVertex2f(0, 0);
        GL11.glTexCoord2f(0, 1);
        GL11.glVertex2f(0, S);
        GL11.glTexCoord2f(1, 1);
        GL11.glVertex2f(S, S);
        GL11.glTexCoord2f(1, 0);
        GL11.glVertex2f(S, 0);

        GL11.glEnd();
    }

そして私のレンダリングコード:

public void a() throws IOException {
    GL11.glTranslatef(0, 0, -10);
    int x = 0;
    while (x < World.BLOCKS_WIDTH - 1) {
        int y = 0;
        while (y < World.BLOCKS_HEIGHT - 1) {
            blocks.b[data.blocks[x][y]].draw(x, y);
            y++;
        }
        x++;
}

エラーはありません(目に見えるものを除く)

4

1 に答える 1

4

現在の変換を初期化またはプッシュ/ポップしているようには見えません。したがって、平行移動は蓄積され、表示される効果が生成され、より大きな値で平行移動するにつれて、ますます離れていきます。

ブロックが 10 ユニット離れているとしましょう。最初は (0, 0)、次に (0, 10)、(0, 20)、(0, 30) などの変換で描画されます。

ただし、平行移動がビュー マトリックスに蓄積されると、実際に得られるのは (0,0)、(0,10)、(0,30)、(0,60) などの平行移動になります。

これは、一連の単純な個別のステップから複雑な変換を構築できるため、重要です。ただし、複数のオブジェクトをそれぞれ独自の変換でレンダリングする場合は、各オブジェクト間に何らかの形でリセットする必要があります。

マトリックス全体を再初期化することもできますが、それは少し乱雑で、以前に行われた他の変換 (カメラなど) を知る必要があります。

代わりに、現在のマトリックスをスタックに「プッシュ」し、必要なローカル変換を実行し、レンダリングしてからマトリックスを「ポップ」して、開始した場所に戻り、次のレンダリングの準備を整えることができます。物体。

この機能はすべて、GL の新しいバージョンでは非推奨になっていることを指摘しておく必要があります。最新の API を使用すると、シェーダーを使用して、計算したい任意の変換を提供できます。

于 2013-02-27T12:48:20.663 に答える