0

これはサイコロ (サイコロ テクスチャで覆われた立方体) の座標部分です。いくつかのコードで、同じ位置を指している共通の座標を省略できることを見てきましたか? どうやっても形が乱れる!どうすれば簡単にできますか?

これが私のコードです --> キューブ コーナー座標、テクスチャ座標、および頂点インデックス

final float pt2[] = new float[] { 
                0, 0, 0,
                0, 1, 0,
                1, 0, 0, 
                1, 1, 0,

                0, 0, 1,
                0, 1, 1, 
                1, 0, 1,
                1, 1, 1,

                1, 1, 1, /* 8 */
                1, 1, 0,
                0, 1, 0, 
                0, 1, 1,

                1, 0, 1, 
                1, 0, 0,
                0, 0, 0,
                0, 0, 1,

                0, 0, 1, /* 16 */
                0, 1, 1,
                1, 1, 1, 
                1, 0, 1,

                1, 0, 0,
                0, 0, 0, 
                0, 1, 0, 
                1, 1, 0 };
        final float texture[] = new float[] { 
                1f, 0.66f, 
                0.66f, 0.66f,
                0f,0.33f, 
                0.33f, 0.33f,

                1f, 0.33f, 
                0.66f, 0.33f,
                0.0f, 0.0f,
                0.33f, 0f,

                0.33f, 0f,
                0.33f, 0.33f,
                0.66f, 0.33f,
                0.66f, 0f,

                0.33f, 0.33f,
                0.33f, 0.66f,
                0.66f, 0.66f,
                0.66f, 0.33f,

                0.66f, 0f,
                0.66f, 0.33f,
                1f, 0.33f, 
                1f, 0f,

                0f, 0.33f,
                0f, 0.66f,
                0.33f, 0.66f,
                0.33f, 0.33f,

        };

        final byte[] vertexIndex = new byte[] { 
                6, 2, 3,7, //1
                5, 1, 0, 4, //2
                8,9,10, 11, //3
                15, 14, 13,12, //4
                20, 21,22, 23, //5
                16, 19, 18, 17 }; //6
4

1 に答える 1

0

はい、実際のところ、ここでやろうとしていることは間違いなく進むべき道です - 各頂点を一度だけ指定してください。メモリを節約するだけでなく、(同じ場所にあるはずの) 2 つ以上の頂点がまったく同じ浮動小数点値を持たない微妙な視覚的アーティファクトを回避します。

これは、私のコードベースとこのDX チュートリアルの組み合わせから得た例です。

頂点座標とテクスチャ座標に別々のデータ構造を使用していますが、ここではそれらはすべて一緒に詰まっていますが、考え方は同じです。

ここで重要なことは、頂点テーブルには 8 つのエントリしかなく、立方体の頂点の数とまったく同じであることです。余分なものはありません。インデックス バッファー内の同じ頂点への複数の参照を持つことができますが、それは、同じ頂点エントリを再利用するために必要なことです。

struct MyVertex
{
    float x, y, z;
    float t, v;
};

// the cube corners, note that there are only 8 entries
// in table - no duplicates

MyVertex vx[] = 
{
    { 0.0f, 0.0f, 0.0f, 0.0f,1.0f },    // one corner of the cube
    { 0.0f, 1.0f, 0.0f, 0.0f,0.0f },
    { 1.0f, 1.0f, 0.0f, 1.0f,0.0f },
    { 1.0f, 0.0f, 0.0f, 1.0f,1.0f },
    { 0.0f, 0.0f, 1.0f, 0.0f,0.0f },
    { 1.0f, 0.0f, 1.0f, 0.0f,1.0f },
    { 1.0f, 1.0f, 1.0f, 0.0f,0.0f },
    { 0.0f, 1.0f, 1.0f, 0.0f,1.0f }
};

// index buffer that points back into vx[]

short indexBuffer[] = 
{
    0,1,2, 2,3,0,   // cube face 0 (2 tris here)
    4,5,6, 6,7,4,   // 1
    0,3,5, 5,4,0,   // 2
    3,2,6, 6,5,3,   // 3
    2,1,7, 7,6,2,   // 4
    1,0,4, 4,7,1    // 5
};
于 2012-10-24T22:48:07.750 に答える