2016-05-25 9 views
1

GPUで制限されたアプリケーションでインスタンス化されたジオメトリをレンダリングすると、パフォーマンス上の向上はありますか?それともドローコールについてのことですか?GPUでインスタンス化を高速化していますか?

すべてのオブジェクトを1つのVBOに焼き付けて1回の描画呼び出しで描画する方が良いのではないでしょうか?すべてのオブジェクトが静的で、頂点メモリで十分であると仮定します。

+0

ハードウェアに応じて最適な頂点数がありますが、描画呼び出しを減らすことは常に良い選択です。 –

答えて

5

インスタンスモデルがの完全にのGPUのpre-T & Lキャッシュに収まるように小さければ、GPUのパフォーマンスが向上する可能性があります。しかし、そうでない限り、GPUは各インスタンスの同じメッシュデータを読み取る必要があります。したがって、200回繰り返された1つのインスタンスは、200の別々のメッシュと同じ帯域幅コストを持つことになります。

すべてのオブジェクトを単一のVBOに焼き付けて1回の描画呼び出しで描画する方が良いのではないでしょうか?

いいえ、必ずしもGPUパフォーマンスであなたを獲得しているとは限らないので、それだけで全体を捨てる必要はありません。インスタンス化が適切であれば、同じメッシュをレンダリングする必要があります。だから、この "すべてのオブジェクトを焼く"はと同じメッシュデータであるを繰り返すでしょう。あなたが描画しようとするすべてのインスタンスに対して1回。読み込み時間の帯域幅を節約していなくても、それはまだメモリ内で非常に無駄です。

メモリの重要性を無視しないでください。メモリを浪費すると、GPUメモリからテクスチャを強制的に取り除き、スラッシングを引き起こす可能性があるため、実行時のパフォーマンスの問題が発生する可能性があります。

さらに柔軟性に欠けます。 1つのフレームでは、128のインスタンスしかレンダリングできません。別の方法では、156が必要になるかもしれません。別の方法では、必要なのは5だけです。途中で、最大数のインスタンスをレンダリングするのに十分なバッファ記憶域を維持する必要があります。実際のインスタンス化で...あなたは気にしません。

これは、インスタンスごとのデータを取得する方法についても扱いません。インスタンス化すると、use gl_InstanceIDをUBO/SSBO /テクスチャ配列から読み取るか、instanced arraysを使用して、頂点属性がインスタンス単位で塗りつぶされるようにすることができます。

gl_InstanceIDを "bake all objects"の余分な整数属性でエミュレートできますが、各頂点を4バイト大きくしました。インスタンス化された配列をエミュレートすることは、メモリで非常に無駄になるため、非スターターではありません。

関連する問題