3

私はDirectXを初めて使用し、を使用して1つのシーンに2つの長方形を描画しようとしていD3DPT_TRIANGLESTRIPます。1つの長方形は問題ありませんが、2つの長方形はまったく異なる球技です。D3DPT_TRIANGLELISTはい、プリミティブ型で描画された4つの三角形を使用して描画できます。私の好奇心は、を使用することに関連する技術にありD3DPT_TRIANGLESTRIPます。私が使用している1つのRectangleに使用しているコードの一部は、D3DPT_TRIANGLESTRIP次のとおりです。

CUSTOMVERTEX recVertex[] = {
    {  10.0f,  10.0f, 0.10f, 1.0f, 0xffffffff, }, // x, y, z, rhw, color
    { 220.0f,  10.0f, 0.10f, 1.0f, 0xffffffff, },   
    {  10.0f, 440.0f, 0.10f, 1.0f, 0xffffffff, },   
    { 220.0f, 440.0f, 0.10f, 1.0f, 0xffffffff, },
}; 

if( FAILED( g_pd3dDevice->CreateVertexBuffer( 4 * sizeof( CUSTOMVERTEX ),
               0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
{
    return E_FAIL;
}

より重要なコード...

VOID* precVertex;    
if( FAILED( g_pVB->Lock( 0, sizeof( recVertex ), ( void** )&pGameField, 0 ) ) ) 
{
return E_FAIL; 
}
 memcpy( precVertex, recVertex, sizeof( recVertex ) );

次に、そのようにレンダリングします...

g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );

このモデルに基づいて、コードを簡単に複製し、カスタム頂点のx値とy値を変更して、別の頂点バッファーを作成すると、機能します。

個人的には、特に100個の長方形などを描画する必要がある状況を考えると、これは最善の方法ではないと感じています。問題は、私には他のアイデアがないということです。だから私の質問は、2つの長方形を描くための最も効率的な方法は何D3DPT_TRIANGLESTRIPですか?また、現在の長方形を複製および変換する方法はありますか?

4

4 に答える 4

3

最も効率的な方法は、インデックス付きの描画を使用してから、2 つの四角形の間でインデックスを繰り返すことです。

つまり、インデックス 0、1、2、3、3、4、4、5、6、7 は、三角形のストリッピングから次の三角形を生成します。

0、1、2 - 1、2、3 - 2、3、3 - 3、3、4 - 3、4、4 - 4、4、5 - 4、5、6 - 5、6、7

三角形 2, 3, 3 - 3, 3, 4 - 3, 4, 4 および 4, 4, 5 はすべて面積がゼロで、グラフィックス カードの非常に早い段階で破棄されます。このようにして、DrawIndexedPrimitive への 1 回の呼び出しでレンダリングされる 4 つの三角形を取得します。

もちろん、これは 10 個のインデックスを送信していることを意味します。12 個のインデックスを送信して、両方の長方形を 4 つの三角形としてトライ リストに描画することもできます。インデックス化された描画を使用すると、ハードウェアが変換済みの頂点を追跡するため、再び煩わされる必要がありません。

つまり、インデックスバッファを次のように定義した場合

0、1、2、3、0、2、4、5、6、7、4、6

少なくとも 4 つの頂点のポスト トランスフォーム キャッシュがある場合 (ほぼすべてのグラフィックス カードには非常に大きなポスト トランスフォーム キャッシュがありますが、GeForce 3 は確かにそうでした!)、両方の三角形がレンダリングされ、各頂点のみがレンダリングされることがわかります。一度変身。直観に反して、DX8 以降のハードウェア (つまり、DX9 または 10 のハードウェア) では、このポスト トランスフォーム キャッシュを使用し、トライアングル リストを非常にシンプルにすることで、実際にはトライアングルよりもトライアングル リストの方が優れたパフォーマンスが得られることがわかります。ストリップ。

要約すると、「私の質問は、D3DPT_TRIANGLESTRIP で 2 つの Rectangle を描画する最も効率的な方法は何ですか?」という質問に対する答えです。答えは D3DPT_TRIANGLELIST を描画することであり、それについて心配するのをやめます:)

于 2009-08-28T06:47:58.780 に答える
2

2番目の長方形の4つの頂点を頂点バッファーに追加してから、2回呼び出しますDrawPrimitive

g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 4, 2 );
于 2009-08-28T05:40:43.890 に答える
1

recVertex8ポイントまで伸ばすことができます。これは一般的な手法です。そのようなモードで正確に動作するように設計された 3D ハードウェア。たとえば、このチュートリアルをチェックしてください。

100 個 (問題のコンテキストでは「膨大な数」を意味すると思います) の長方形を描画する場合は、meshesの使用を検討する必要があります。

于 2009-08-28T05:56:26.653 に答える
0

一般に、ジオメトリをより大きなインデックス付きの頂点バッファーにまとめて、各 3D オブジェクトのバッファーへの正しいオフセットで適切な描画関数を呼び出すことが最善です。ハードウェアはオブジェクトを個別のエンティティとして認識しないことに注意してください。ハードウェアは、頂点/インデックス バッファー、テクスチャ、シェーダー プログラム、およびさまざまな状態のみを考慮します。あなたの仕事は、すべてを最適な方法でハードウェアに供給し、フレームごとに適切な量の描画タスクをまとめることです。

このような非常に小さなジオメトリと固定機能の場合は、すべてを 1 つのバッファーにまとめることは間違いありません。

于 2009-09-03T11:52:44.240 に答える