1

メッシュごとにドローコールを発行する必要がないように、一度に多くのメッシュをレンダリングする方法を探しています。ここでは 2D レンダリングを扱っていますが、正方形などの典型的なオブジェクトには三角形が 2 つしかない場合があります。ただし、オブジェクトが非常に複雑で、何千もの三角形がある場合もあります。

これで、各オブジェクトは単独で動き回ることができます。概念的には、「オブジェクト」ごとに VBO (または VBO/IBO ペア) を用意することは完全に合理的です。オブジェクトが変更されない限り、各フレームを GPU にアップロードする必要があるのは変換情報だけです。向きの値。または、同等に、変換行列。

しかし、そのアプローチの問題は、1000 個の正方形オブジェクトのシーンで、1000 個の VBO と 1000 個の IBO を初期化する必要があり、2000 個の三角形をレンダリングするために各フレームで 1000 セットのユニフォームを設定する 1000 個の描画呼び出しが必要になることです。

わかった。これらのオブジェクトがすべて同一である場合、それらを記述する VBO/IBO を 1 つ持つことができます。変換データを使用して、Uniform Buffer オブジェクト (または、Uniform 配列の方が適切かもしれません。これらの使用方法をまだ学習する必要があります) をセットアップできます。それぞれを呼び出し、1 つのインスタンス化描画呼び出しを発行して、頂点シェーダーが受信したインスタンス番号を使用して UBO から変換データをプルするようにします。偉大な。

もう一歩だけ進みたい。同一でないメッシュでのインスタンス化に相当するものを実行したい: 1000 の異なるオブジェクトがあり、1000 の個別の頂点/インデックス バッファー ペア、または 1 つの巨大な頂点/インデックス バッファーのペアで喜んで記述します。1 回の呼び出しで変換データを GPU に送信したいと考えています。ドライバー/GPU に適切な頂点をバインドまたは選択させるだけです。

これはできますか?SM4 ジオメトリ シェーダーを使用せずに実行できますか?

更新:これを達成するための潜在的な方法を考えました。変換を含む UBO にインデックスを付けるための「インスタンス化」値として、頂点属性を使用します。これはそれを行う方法ですか?

4

1 に答える 1

0

オブジェクトごとに1つのVBOは必要ありません。すべてのオブジェクトを1つの単一のVBOまたはVBOの小さなセットに連結するだけです。gl*Pointer関数のデータパラメータにオフセットを追加するかglDrawElementsBaseVertex、描画時にオフセットを追加するために使用して、そのVBOにアドレス指定できます。インデックス配列の4つのインデックスの代わりに、すべての小さなオブジェクトのインデックス配列を連結します。ストリップまたはファンプリミティブを使用してglPrimitiveRestartIndexいる場合は、新しいプリミティブが開始されるときにそれを使用して特別なインデックスを設定できます。

このように、使用されているマテリアル設定と全体的な変換およびシェーダーパラメーター(つまり、テクスチャ、シェーダー、シェーダーユニフォーム)によってのみレンダリング呼び出しを分割する必要があります。

于 2012-03-03T12:00:40.433 に答える