OpenGL ES 2.0でのジオメトリのインスタンス化


12

OpenGL ES 2.0でジオメトリのインスタンス化を行うことを計画しています。基本的に、同じジオメトリ(椅子)をシーンで1000回レンダリングする予定です。

OpenGL ES 2.0でこれを行う最良の方法は何ですか?

モデルビューmat4を属性として渡すことを検討しています。属性は頂点データごとであるため、同じ三角形の各頂点に対してこの同じmat4を3回渡す必要があります(モデルビューは三角形の頂点全体で一定のままなので)。

これは、GPUに送信される多くの追加データに相当します(2つの追加頂点* 16フロート*(三角形の数)追加データの量)。

または、三角形ごとに一度だけmat4を送信する必要がありますか?しかし、属性は「頂点ごと」のデータとして定義されているため、属性を使用してどのように可能ですか?

OpenGL ES 2.0でインスタンス化を行うための最良かつ効率的な方法は何ですか?


3
本当に恋しいglVertexAttribDivisor:(
ウィル

回答:


9

ES2にはglVertexAttribDivisorも浮動小数点テクスチャも含まれていないため、オプションはかなり制限されています。

椅子モデルをまだVBOに入れていない場合は、必ずVBOに入れてください。そこから個々のドローコールにほぼ制限されます-椅子ごとに1つ-各椅子の変換マトリックスをGPUに可能な限り効率的に取得するかどうかの問題です。

通常のglUniform呼び出しでこれを行うか、余分な頂点属性スロットを悪用して、各椅子を描画する前にglVertexAttrib(注:glVertexAttribPointerではない)呼び出しを行い、4つのスロットを使用してマトリックスを指定すると、これらの値は「固定」されます椅子の各頂点。これは、一部のハードウェアでは十分に高速なパスですが、他のハードウェアでは低速になる可能性があるため、実験する必要があります。

椅子が回転しない場合は、シェーダーに位置を送信し、その場で新しい変換マトリックスを作成するだけです。それは恐ろしいように聞こえますが、実際には信じられないほど高速で(3つのフロートを設定するだけです)、仕事をするかもしれません。

しかし、全体的に、そしてあなたが典型的なモバイルプラットフォームを目指していると仮定すると、私はあなたが何をするにしても、ドローコールはあなたを殺すだろうと考えています。


6

最善の策は、スキンモデルに非常によく似たインスタンス化アプローチを使用することです。椅子のコピーを多数保持するVBOを作成します。これらはすべて同一です。ここで、すべての頂点には、適用される変換行列へのインデックスを保持するバイト属性が必要です。マトリックスの配列をシェーダーに送信し、それらを各椅子のワールドトランスフォームとして使用します。この方法では、VBOのデータを書き換えずに、各呼び出しで配列パラメーターの最大サイズと同じ数の椅子を描画できます。


3

Wolfire Gamesには、オブジェクトの高速インスタンス化に関する優れたブログ投稿があります。彼らがすることは、モデルを何回もレンダリングしますが、オブジェクトごとに異なるマトリックスを均一なスロットに送信します。

これは、データを一度送信するだけで(オブジェクトのバッチをレンダリングする際の最大のボトルネックは常に帯域幅になります)、シェーダーでモデルを変換するだけなので、オブジェクト全体をインスタンス化する非常に効率的な方法です。


+1とにかく、Nvidiaテキストの参照がモバイルPVRチップにも適用できるかどうかはまだわかりません。特に、ドライバーの部分に関する言及について。http.download.nvidia.com/developer/SDK/Individual_Samples/DEMOS/...
Eonil

1

http://www.youtube.com/watch?v=rfQ8rKGTVlg

これはWebGL上のGoogleトークです。これはJavaScript用のOpenGL ESです。つまり、ジオメトリのインスタンス化もありません。あなたのボトルネックがGPUにあるのかCPUにあるのかわからないので、それはあなたにアイデアを与えるかもしれません。

ただし、均一な変数について学習する必要があります。属性にmat4を送信する必要はまったくありません。椅子のすべての頂点は同じマトリックスによって変換されます。三角形ごとではなく、モデルごとに1回送信するだけです。ユニフォーム変数を使用すると、それを行うことができます。これらは、シェーダープログラム自体で設定できる特別な種類の変数です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.