1

directx での 2D 三角形のレンダリングに関するチュートリアルを完了しました。ここで、1 つの三角形のレンダリングに関する知識を使用して、複数の三角形、または画面上の複数のオブジェクトをレンダリングしたいと考えています。

頂点バッファと入力レイアウトのリスト/スタック/ベクトルを作成してから、各オブジェクトを描画する必要がありますか? または、これに対するより良いアプローチはありますか?

私のプロセスは次のようになります。

  • 頂点シェーダーとピクセル シェーダーを含む directx のセットアップ
  • 画面に描画する必要がある各形状の頂点バッファーを作成し、それらを配列に格納します。
  • フレームごと(フレームごと)にレンダーターゲットに描画する
  • レンダー ターゲットを提示する (各フレーム)

回答する際は、DirectX およびグラフィックス プログラミング全般について非常に初歩的な知識があることを前提としてください。

4

3 に答える 3

3

形状ごとに頂点バッファーを作成する必要はありません。すべての三角形のすべての頂点を格納するための頂点バッファーを作成し、すべての形状のすべてのインデックスを格納するためのインデックス バッファーを作成し、最後にインデックス バッファーでそれらを描画できます。私は DX11 に詳しくないので、参考までに D3D 9 のリンクをリストします。概念は同じで、いくつかの API が変更されているだけだと思います。

インデックス バッファー (Direct3D 9)

Vertex および Index バッファからのレンダリング

三角形の形状が同じで、位置や色が異なるだけの場合は、ジオメトリのインスタンス化の使用を検討できます。これは、同じジオメトリの複数のコピーをレンダリングする強力な方法です。

ジオメトリのインスタンス化

ジオメトリの複数のインスタンスを効率的に描画する(D3D9)

于 2012-11-08T01:42:00.303 に答える
0

do this に必要な頂点バッファーは 1 つだけです。

これができることです。三角形の情報を保持する配列/ベクトルを作成できます。たとえば、(疑似コード)

struct TriangleInfo{
  ..... texture;
  vect2 pos;
  vect2 dimension;
  float rot;

}

次に、描画方法で

for(int i=0; i < vector.size(); i++){

    TriangleInfo tInfo = vector[i];
    matrix worldMatrix = Transpose(matrix(tInfo.dimension) * matrix(tInfo.rot) * matrix(tInfo.pos));

    shaderParameters.worldMatrix = worldMatrix; //info to the constabuffer

    ..
    ..
    dctx->PSSetShaderResources(0, 1, &tInfo.texture);
    dctx->Draw(0,4);
}

次に、頂点シェーダーで次のようにします。

cbuffer cbParameters : register( b0 ) { 
    float4x4 worldMatrix; 
};

VOut main(float4 position : POSITION, float4 texCoord : TEXCOORD)
{
    ....
    output.position = mul(position,worldMatrix);
    ...

}

すべてが疑似コードであることを思い出してください。しかし、これでアイデアが得られるはずですが、三角形をたくさん作成しようとしている場合、たとえば 1000 個の三角形を作成する場合は問題があります。これは最適なオプションではない可能性があります。DrawIndexed を使用して変更する必要があります。各三角形の頂点位置、または DrawInstanced を使用することができます。これはより単純で、すべての情報を 1 回の Draw 呼び出しで送信できます。

于 2014-01-16T11:47:49.837 に答える
0

DirectX についてはよくわかりませんが、GPU でのレンダリングの一般的なルールは、メッシュごとに個別の頂点バッファーとインデックス バッファーを使用することです。

多くのインデックス バッファで単一の頂点バッファを使用することを制限するものは何もありませんが、実際には、特に小さなメッシュでパフォーマンスが向上する可能性があります...

于 2012-11-07T15:26:21.927 に答える