私のプログラムでは、多くの球を描きたいと思っています。まず、球の頂点とインデックスを作成し、voa/vbo/ibo にバインドします。その後、1000 個のランダム モデル マトリックスを作成します。これで、メッシュを描画する方法が 2 つあります。
- ModelMatrices 呼び出しのリストを 1000 回ループするだけ
glDrawElements
です。マトリックス MVP は CPU で計算され、ユニフォームのようにシェーダーに送信されます。 - すべてのマトリックスを追加の VBO にバインドし、「in」変数のようにシェーダーに送信します。次に、 で 1 回だけ呼び出します
glDrawElementsInstanced
。
テスト プログラムでは、1000 個の球体 (約 2000 万個の頂点) を描画します。最初の方法を使用すると約 27FPS になり、2 番目の方法ではパフォーマンスが 19 FPS に低下します。理論的には、2 番目の方法は 1 番目よりも優れたパフォーマンスを達成するはずです。
これがコードです。
- VBO への行列のバインドhttp://pastebin.com/iX9tUWfY
- 図面http://pastebin.com/FsSXcnqK http://pastebin.com/8WMrUiu1
- 頂点シェーダーhttp://pastebin.com/39m34PZk
ボトルネックは、頂点シェーダーでのこの乗算であると思います。これは(VP * ModelMatrix)
、各 (メッシュの頂点) * 1000 ごとに実行する必要があるためです。
何をアップグレードでき、何が間違っていますか?