1

それぞれが任意の頂点数を持つ複数のオブジェクトで満たされた単一のVBO(またはおそらく複数のVBO)について考えてみます。実例として、VBO内に500個の頂点を持つリンゴと650個の頂点を持つオレンジがあるとします。

通常、オレンジを描画したい場合は、glDrawRangeElementsを呼び出して、要素500〜1150を描画したいことを示します。空間の特定の位置にオレンジを描画したい場合は、モデル変換を使用します。

しかし、潜在的に何千ものオブジェクトを描画したい場合はどうなりますか?さらに、VBOに数百のオブジェクトが含まれている場合、一種の「オブジェクトライブラリ」として数千のオブジェクトが含まれているとは限りません。イミディエイトモードを使用して(つまり、オブジェクトごとにglDrawRangeElementsを手動で呼び出す)、描画したいものをGPUに送信する必要はありません。これにより、GPUとの通信に多大なコストのかかるオーバーヘッドが追加されます。

私が探しているのは、OpenGLを使用してある種の配列を一度にアップロードする方法です。この配列には、描画したい各オブジェクトのある種の識別子と、おそらくそれぞれの変換(位置、回転)が含まれます。したがって、任意の場所にさまざまな果物の海を描きたい場合は、インデックスを1回計算してアップロードするだけです。配列は相互に関連させることができます。たとえば、配列は次のようになります。[オブジェクトID 1 ]、[位置1 ]、[回転1 ]...[オブジェクトIDn ]

4

2 に答える 2

3

最終的に、あなたがやろうとしていること(完全に異なるオブジェクトをたくさん描くこと)は、「インスタンス化」のいずれに対しても機能しません。

インスタンス化は、同じオブジェクト用です。つまり、異なる場所に描画される繰り返しオブジェクトです。あなたがしているのは、たくさんの異なるオブジェクトを描くことです。そのためには、複数のドローコールを発行する必要があります。それを避けることはできません。

できる最善のことは、状態の変化を最小限に抑えることです。同じシェーダーを使用してオブジェクトをレンダリングします。オブジェクト間でテクスチャを変更する必要がないように、場合によっては配列テクスチャでテクスチャアトラスを使用します。(初期設定以上)使用したり、エレメントバッファを変更したりしないでください。glVertexAttribPointer

その最後の部分の鍵はglDrawElementsBaseVertexです。バッファオブジェクト内のすべてのオブジェクトが同じ頂点形式を使用している限り、それらすべてを巨大な配列と同じバッファに貼り付けることができます。次に、インデックスリストを使用してそれらを分離します。ベース頂点部分を使用すると、インデックスを比較的小さく保つことができます。

最終的には、オブジェクト間のオブジェクトのモデル空間の位置のみを変更する必要があります。それを処理するためのいくつかのオプションがあります。

最も簡単なのはglUniform、通常どおり、各オブジェクトのモデルからカメラへのマトリックスを変更するために使用することです。あなたは今までにそれを行う方法を知っているはずです。

もう少し複雑なのは、均一なバッファを使用して、描画するすべてのオブジェクトのモデルからカメラへのすべてのマトリックスを格納することです。glBindBufferRangeオブジェクト間で、そのオブジェクトの特定のマトリックスをバインドするために使用します。これが以前の方法よりも速いか遅いかについての情報はありません。実装には、均一なバッファの範囲に対して実装に依存する配置があることに注意してください。

技術的には、GL 4.xハードウェアを使用すると、レンダリングコマンドを表すバッファオブジェクトにデータを作成し、それを使用してレンダリングできます。これは4.0のコアであり、間接レンダリングと呼ばれます。このための一般的な考え方は、OpenCLまたは特殊なGLシェーダープロセスがデータをバッファーオブジェクトに書き込み、クライアントコードは、データを読み戻して手動で行うのではなく、「彼が言ったことをレンダリングする」と言うだけでよいというものでした。電話をglDrawElementsかける。

各呼び出しは個別に発行する必要があるため、これは役に立ちません。AMDのマルチ間接描画機能を使用しても、各オブジェクトに異なる変換を提供する必要があるため、それでも役に立ちません。また、マルチドローでは、オブジェクト間で異なる変換を行うことはできません。

于 2012-06-21T17:04:57.620 に答える
1

インスタンス化が必要なようです。

ARB_instanced_arrays/を調べてくださいARB_draw_instanced

これがさまざまなテクニックの比較です

固定機能のパイプラインを使用している場合は、SOLですが:(

于 2012-06-21T15:58:33.907 に答える