4

libGdx を使用して 2D ゲームを作成しており、この特定の方法を使用して単純な 2D テクスチャを描画し、4 つの頂点を個別に指定しようとしています。

draw(Texture texture, float[] spriteVertices, int offset, int length)

説明: 指定された頂点を使用して四角形を描画します。4 つの頂点が必要で、それぞれが x、y、color、u、v の順に 5 つの要素で構成されています。

他の描画方法は正常に機能しますが、これを機能させることはできません。私がしようとしているのはこれです。

batch.draw(boxTexture, new float[] {-5, -5, 0, Color.toFloatBits(255, 0, 0, 255), 0, 0, 
                5, -5, 0, Color.toFloatBits(255, 255, 255, 255), 1, 0, 
                5, 5, 0, Color.toFloatBits(255, 255, 255, 255), 1, 1, 
                -5, 5, 0, Color.toFloatBits(255, 255, 255, 255), 0, 1}, 3, 3);

OpenGL がどのように機能するか、特にオフセットと長さがどうあるべきかについてはあまり詳しくありません。より知識のある人は、これを機能させる方法を知っていますか?

アップデート:

メッシュを使用して動作しますが、透明度がないことがわかり、迷惑です。最後に、SpriteBatch にカスタム メソッドを追加しました。頂点は時計回りに描画されます。

public void drawQuad (Texture texture, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float col) {
        if (!drawing) throw new IllegalStateException("SpriteBatch.begin must be called before draw.");

        if (texture != lastTexture) {
            switchTexture(texture);
        } else if (idx == vertices.length) //
            renderMesh();

        final float u = 0;
        final float v = 1;
        final float u2 = 1;
        final float v2 = 0;

        vertices[idx++] = x1;
        vertices[idx++] = y1;
        vertices[idx++] = col;
        vertices[idx++] = u;
        vertices[idx++] = v;

        vertices[idx++] = x2;
        vertices[idx++] = y2;
        vertices[idx++] = col;
        vertices[idx++] = u;
        vertices[idx++] = v2;

        vertices[idx++] = x3;
        vertices[idx++] = y3;
        vertices[idx++] = col;
        vertices[idx++] = u2;
        vertices[idx++] = v2;

        vertices[idx++] = x4;
        vertices[idx++] = y4;
        vertices[idx++] = col;
        vertices[idx++] = u2;
        vertices[idx++] = v;
    }
4

3 に答える 3

3

Offset は配列内の開始位置 (0 の場合) であり、length は配列が通過する必要があるインデックスの数です。あなたの場合:4ポイント、各ポイントに5つのデータがあります:4 * 5 = 20。

値 3 の float では三角形を作成するには不十分であるため (15 が最小)、Draw はレンダリング プロセスを開始しませんでした。

PT の回答に関しては、この特定の関数はファン レンダリングを行うため、正しい順序は時計回りまたは反時計回りです。

また、これらのポイントとテクスチャを配置する順序によって、テクスチャが上下逆さまにレンダリングされます (これが意図されたものかどうかはわかりません)。

于 2014-05-12T04:49:01.477 に答える
2

オフセットと長さは、spriteVertices配列のスライスを取得するためのものです。あなたの場合、それらは配列0でなければなりません(頂点をローカル変数に入れて長さを計算します)。.length

また、それが必要かどうかはわかりませんが、三角形に適した方法で頂点を渡す必要があると強く思います。現在、反時計回りの列挙を行っています。通常、クワッドの場合、次のような Z パターンを使用する必要があります。

3-4
 \
1-2  

(これは、OpenGL がリスト内の 3 つの頂点の各セットを取得し、結果の三角形をレンダリングするためです。したがって、頂点 1、2、3 および 2、3、4 は両方とも有用な三角形を作成する必要があります。)

于 2012-08-15T18:55:23.690 に答える
-2
3-4

 \

1-2*

それは間違っています。次のようにする必要があります。

4-3

1-2
于 2015-12-30T20:12:51.247 に答える