メッシュごとに1つの頂点バッファーを使用する必要がありますか、それとも1つの頂点バッファーに複数のメッシュを格納できますか?もしそうなら、私はそれをすべきですか、そして私はそれをどのように行うでしょうか?
4 に答える
複数のメッシュを 1 つの頂点バッファーに格納できます。いくつかの小さなメッシュを 1 つのバッファーに入れると、パフォーマンスが向上する場合があります。非常に大きなメッシュの場合は、別のバッファを使用する必要があります。SetStreamSource
現在のメッシュの頂点バッファ オフセットを指定できます。
pRawDevice->SetStreamSource( 0, m_VertexBuffer->GetBuffer(), m_VertexBuffer->GetOffset(), m_VertexBuffer->GetStride() );
TBH 一般に、それらすべてを 1 つの大きなバッファーに入れる理由は、描画呼び出しを節約するためです。頂点バッファーを切り替えるコストはごくわずかです。それらすべてを 1 つの頂点バッファーにマージし、1 回の描画呼び出しで 10 個のオブジェクトをレンダリングできれば、大きな勝利を収めることができます。
通常、それらをマージするには、すべての頂点データを含む 1 つの大きな頂点バッファーを作成するだけで、その中に既にワールドが変換されています。次に、それらを次々にレンダリングするインデックス バッファーを設定します。次に、最小限のドローコールですべてを描画します。もちろん、頂点バッファーの一部を更新する必要があるものを 1 つ移動すると、静的ジオメトリにとって理想的な状況になります。
すべてのオブジェクトが同じ場合、1 つの頂点バッファー (1 つのオブジェクト定義を含む) と 1 つのインデックス バッファーのみを使用することになります。マトリックスはオブジェクトを動かしたりアニメートしたりします...
すべてのオブジェクトが異なり、移動/アニメーション化されている場合は、個々の VB に固執します。それらをすべて一緒にマージしても、違いに気付くとは思えません。
私の経験では、バッファーが非常に小さくも大きくもない限り、それほど大きな違いはありません。バッファを切り替える際の非効率性は、より小さなバッファでメモリを管理するためのより多くの操作をドライバに与えることにより、効率が向上することと一致すると思います。
OpenGL を使用glVertexPointer()
すると、VBO 内の特定のオフセットから描画を開始できます。D3Dについてはわかりません。