2009-08-28 12 views
3

私はDirectXを初めて使用しており、D3DPT_TRIANGLESTRIPを使用して1つのシーンに2つの四角形を描画しようとしています。 1つの長方形は問題ありませんが、2つの長方形はまったく異なるボールゲームです。はい、D3DPT_TRIANGLELISTプリミティブタイプで描画された4つの三角形を使用して描画できます。私の好奇心は、テクニックに関わっており、D3DPT_TRIANGLESTRIPを使っています。私は次のようにD3DPT_TRIANGLESTRIPを使用することで1長方形のために使用していたコードの パーツ:D3DPT_TRIANGLESTRIPプリミティブタイプを使用してDirectXで2つの切り離された四角形を描画する方法

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矩形かそのようなものを描く必要がある状況を考えて行く最善の方法ではないと感じます。事は、私には他のアイデアはありません。だから私の質問は、D3DPT_TRIANGLESTRIPで2つの四角形を描画する最も効率的な方法は何ですか?現在の矩形を複製して変換する方法もありますか?

答えて

1

2番目の矩形の4つの頂点を頂点バッファに追加し、次にDrawPrimitiveを2回呼び出します。

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); 
+0

これは私が実際に探していたものです。その与えられた私に大きな洞察力。 1つのことは、CreateVertexBuffer関数で8つの頂点を持つので、4から8に変更することを忘れないでください。 –

1

recVertexを8ポイントまで拡張できます。これは一般的な手法です。このようなモードで正確に動作するように設計された3Dハードウェアたとえば、thisチュートリアルをご覧ください。

100(私はそれが質問文脈で "巨大な数"を意味すると仮定します)の長方形を描画する場合は、meshesを使用することを検討する必要があります。

3

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

すなわち、インデックス0、1、2、3、3、4、4、5、6、7は

0、1、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個のインデックスを送り、両方の長方形を3つの三角形として3つのリストに描画することもできます。インデックスドローイングを使用すると、ハードウェアは既に変換された頂点を追跡して、再度気にする必要がないことがわかります。

つまり、あなたは

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

として、あなたのインデックスバッファを定義し、あなたはポストを持っているキャッシュを変換する場合少なくとも4つの頂点(ほとんど全てのグラフィックスカードには変換後のキャッシュがかなり大きくなっていますが、GeForce 3は確かにそうでした!)すると、両方の三角形がレンダリングされ、各頂点は一度だけ変換されることがわかります。直感的には、DX8のハードウェア(DX9または10のハードウェア)を直観的に見れば、このポストトランスフォームキャッシュの使用と三角形リストのシンプルさは、三角形リストよりも三角形リストのほうが効率的に優れていることを意味しますストリップ。

したがって、「私の質問は、D3DPT_TRIANGLESTRIPで2つの長方形を描画する最も効率的な方法は何ですか?」という質問に対する答えです。答えはD3DPT_TRIANGLELISTであり、心配する必要はありません:)

0

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

このような小さなジオメトリと固定機能では、ロット全体を1つのバッファに入れなければなりません。

関連する問題