3

クワッドの描画に関する簡単な質問。私は現在使用しています:

GraphicsDevice.DrawPrimitives(PrimitiveType primitiveType,
                        int startVertex, int primitiveCount);

これにより、クワッドは完全にきれいに描画されますが、クワッドを機能させる唯一の方法は、クワッドに6つの頂点を使用することです(2つの三角形として描画します)。GPUに4つの頂点を供給し、動的頂点バッファーを保持できるかどうか疑問に思っています。

DrawUserIndexedPrimitives()を使用してこれを実行できることはわかっていますが、バッファーが必要です。;)

編集:必要ですか?必要な場合は、GPUに2つの三角形ごとに4つの頂点を供給していることをどこに伝えますか?現在、クワッドをnQuads * 6頂点として頂点バッファーに格納しており、GPUは3つの頂点ごとに三角形として使用します。したがって、4つの頂点に切り替えるだけで、次のようになります。

Quads: {v1,v2,v3,v4} {v5,v6,v7,v8} ...
Triangles: {v1,v2,v3} {v4,v5,v6} {v7,v8 ...}

三角数2は最初のクワッドから1つの頂点を使用し、番号3は2番目のクワッドから2つの頂点を使用するというように、これは良いことではありません。

編集2:申し訳ありませんが、実際には動的頂点バッファーを使用しています。

6つの頂点で大腿四頭筋を行う方法に関するコードを投稿します。

        // ## CONSTRUCTION
        // Setting up buffer and vertex holder.
        particleVertexBuffer = new DynamicVertexBuffer(graphicsDevice,
            ParticleQuad.VerticesSizeInBytes * nMaxParticles,
            BufferUsage.WriteOnly);
        particleVertices = new ParticleVertex[nMaxParticles * 6];

        // ## ADD VERTICES
        particleVertices[i].Set();
        particleVertices[i+1].Set();
        particleVertices[i+2].Set();
        particleVertices[i+3].Set();
        particleVertices[i+4].Set();
        particleVertices[i+5].Set();


        // ## SET BUFFER
        particleVertexBuffer.SetData(particleVertices, 0, nMaxParticles * 6, SetDataOptions.NoOverwrite);
        graphicsDevice.Vertices[0].SetSource(particleVertexBuffer, 0, ParticleVertex.SizeInBytes);

        // ## DRAW
        graphicsDevice.DrawPrimitives(PrimitiveType.TriangleList,
                    FirstUsedParticle * 6, ((LastUsedParticle - FirstUsedParticle)+1)* 2);

さて、私は循環キューやその他のものを使用しているので、もう少しありますが、これで十分に理解できます。

4

1 に答える 1

2

はい、それは可能です。PrimitiveTypeとしてTriangleStripを使用する必要があります。VertexBufferでは、次の順序で頂点を定義します。

1---3
|\  |
| \ |
|  \|
0---2
変更した質問に対処するために編集する

あなたのコードがどのように見えるかはわかりませんが、一般的に、プリミティブカウントに関する情報は次の場所で使用されます。

  • バッファの作成:public VertexBuffer ( GraphicsDevice graphicsDevice, int sizeInBytes, BufferUsage usage )// sizeInBytesは、プリミティブの数によって異なります。
  • ドローコール:public void DrawPrimitives ( PrimitiveType primitiveType, int startVertex, int primitiveCount )

頂点フォーマットのサイズに関する情報は、さらにいくつかの場所で必要ですが、サイズは変更されないため、問題にはならないことに注意してください。

アップデート

明確化のためのThx、今私はあなたが達成したいことを知っています。問題を処理する正しい方法は、頂点バッファをインデックスバッファと組み合わせて使用​​することです。頂点バッファは頂点を保持し、インデックスバッファは頂点を接続して三角形を形成する順序を保持します。画面に次のクワッドを描画するとします。

 (0,1)________(1,1)
     |        |
     |        |
     |________|
 (0,0)        (1,0)

あなたが以前にしたことはこれでした:

Vector3 v0, v1, v2, v3;
v0 = new Vector3(0, 0, 0);
v1 = new Vector3(1, 0, 0);
v2 = new Vector3(0, 1, 0);
v3 = new Vector3(1, 1, 0);

List vertices = new List();
//first triangle
vertices.add(v0);
vertices.add(v2);
vertices.add(v1);

//second triangle
vertices.add(v2);
vertices.add(v1);
vertices.add(v3);

VertexBuffer vb = new VertexBuffer(...);
vb.setData(verticesToDraw);

//draw the scene using PrimitiveType.TriangleList and primitive count 2

あなたが今していることはこれです:

//vertices stay the same as in the example above!
List vertices = new List();
vertices.add(v0);
vertices.add(v1);
vertices.add(v2);
vertices.add(v3);

int[] indices = new int[6];
//first triangle
indices[0] = 0;
indices[1] = 2; 
indices[2] = 1;

//second triangle
indices[3] = 2;
indices[4] = 1;
indices[5] = 3;

VertexBuffer vb = new VertexBuffer(...);
IndexBuffer ib = new IndexBuffer(...);

vb.setData(vertices);
ib.setData(indices);

/*draw using the DrawIndexedPrimitives() method rather than the
DrawPrimitives() method and use PrimitiveType.TriangleList and
primitive count 2.*/

ご覧のとおり、クワッドごとに2つの頂点を保存しますが、代わりに、頂点から三角形を作成する順序を指定する6つのインデックスを使用する必要があります。したがって、この方法は、頂点が大きく(法線、テクスチャ座標などの多くの情報を処理する)、多くの三角形で共有されている場合にのみ役立ちます。

Riemers.netには、頂点バッファとインデックスバッファに関する非常に優れた、短くて理解しやすいチュートリアルがあります。

于 2010-07-07T15:09:55.403 に答える