0

OpenGL ES、glDrawArrays、および GL_TRIANGLE_STRIP を使用して、「単純な」2D グラフィックスを描画しています。

13x13 ポイント (または他の任意のサイズ) のテクスチャを 1 つ取得し、指定された数の列と行に出力することを目的とする関数を作成しています。したがって、2 行 3 列の場合、26x39 ポイントの 6 つのタイルで覆われた領域を意味します。最初の行は以下のコードでうまく機能しますが、2 つ以上の行を指定するとすぐに出力が文字化けします。

for (int row = 0; row < heightInTiles; row++) {
    for (int col = 0; col < widthInTiles; col++) {
        vertexIndexOffset += 8;
        startX = (GLshort)(col * TEXTUREWIDTH);
        startY = (GLshort)(row * TEXTUREHEIGHT);

        // Vertices
        vertices[vertexIndexOffset] = startX; // 1
        vertices[vertexIndexOffset + 1] = startY; //0.0;

        vertices[vertexIndexOffset + 2] = startX; // 2
        vertices[vertexIndexOffset + 3] = startY + (GLshort)TEXTUREHEIGHT;

        vertices[vertexIndexOffset + 4] = (GLshort)(startX + TEXTUREWIDTH); // 3
        vertices[vertexIndexOffset + 5] = startY;

        vertices[vertexIndexOffset + 6] = (GLshort)(startX + TEXTUREWIDTH); // 4
        vertices[vertexIndexOffset + 7] = startY + (GLshort)TEXTUREHEIGHT;

        // Texture coords
        uvs[vertexIndexOffset] = WRESULT; // 1
        uvs[vertexIndexOffset + 1] = 0;
        uvs[vertexIndexOffset + 2] = WRESULT; // 2
        uvs[vertexIndexOffset + 3] = HRESULTNEXT;
        uvs[vertexIndexOffset + 4] = WRESULTNEXT; // 3
        uvs[vertexIndexOffset + 5] = 0;
        uvs[vertexIndexOffset + 6] = WRESULTNEXT; // 4
        uvs[vertexIndexOffset + 7] = HRESULTNEXT;
    }
}
4

1 に答える 1

1

と を仮定するheightInTiles=1widthInTiles=2、コードは最初に 2 つの「ストリップされた」三角形 1234 を生成します。次のセルでは、頂点 5678 が生成されます。ここで、3=5 および 4=6 です。したがって、2 つの縮退三角形 (面積0) があります。ただし、これは機能します(まあ、vertexIndexOffset += 8;内側のループの最後に移動した後)

 2----------4/6----------8
 |           |           |          
 |           |           |          
 |           |           |          
 |           |           |          
 1----------3/5----------7

と を仮定するheightInTiles=2widthInTiles=1、図は多少異なって見えます。

 6-----------8
 |           |
 |           |
 |           |
 |           |
 2/5--------4/7
 |           |
 |           |
 |           |
 |           |
 1-----------3

では、ストリップ12345678 を描画するとどうなるでしょうか? 123、234はOKですが、345ですか?これはオーバーラップしており、これらの頂点のテクスチャ座標に注意してください。頂点 2 と 5 は異なる UV を持っています! 上記のように、不要な三角形が 2 つありますが、今回はこれらに領域があり0ません。

新しい行が開始されたら、2 つのダミー頂点を挿入する必要があります。これにより、基本的に別の場所でストリップが再開されます。三角形のストリップに 1234 455678 が含まれていたらどうなるでしょうか? これで、123 と 234 が正常に描画され、次に 344、445、455、および 556 に面積0があり、次に描画される三角形は 567 と 678 です。

于 2012-06-11T17:18:00.523 に答える