問題タブ [geometry-instancing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - OpenGL で数百万のオブジェクトをインスタンス化: 1 秒あたりのフレーム数を改善
私の最終的な目標は、さまざまなサイズと色の 100 万個の球体を 60 fps でレンダリングすることです。画面の周りでもカメラを動かせるようにしたいです。
私が勉強しているチュートリアルのこのページのコードを変更して、多くの球体をインスタンス化しようとしました。しかし、球体が 64 個になると fps が 60 を下回り、球体が 900 個になると fps はわずか 4 になることがわかりました。これ。60 fps は 64 個の球体のみで達成できるはずです。何らかの方法で、CPU と GPU が必要以上に頻繁に通信するようになっていると思います。だから私の質問は: fps を低く (理想的には 60 fps) せずに非常に多くのオブジェクト (理想的には数百万) をインスタンス化するにはどうすればよいですか?
最後の fps 呼び出しから経過した時間を(10 / time_elapsed)
10 フレームごとに計算して fps を計算しています。コードの118行目 time_elapsed
を使用してこれを印刷しています。printf
私はこのチュートリアルでOpenGL を学んできたので、Visual Studio 2013 で32ビットの GLEWと32 ビットの GLFWを使用しています。
上記のチュートリアルに基づいて、独自の例をコーディングしてみました。ソースコード:
(ライン #2 をインスタンス化する球の数に設定します。ライン #2 に整数の平方根があることを確認します。ライン 4 を球の詳細に設定します。最小値は 0 です。より高い数 =より詳細な。)
頂点シェーダー: (core.vs という名前)
フラグメント シェーダー: (core.frag という名前)
シェーダー クラス: (名前は Shader.h)
opengl - インスタンス化されたジオメトリ シーンのフレームレートの向上
大量 (数百万) のインスタンス化されたジオメトリをレンダリングしています。形状自体は単純で、底面のない箱です。レンダリングされたシーンは、実際にはボックスが線である 3D グラフです (カリングを使用して一度にレンダリングされる面は 3 つだけです)。
シーンが画面の小さな領域 (ズームアウトまたは小さなウィンドウ) を占める場合、フレーム レートは問題ありませんが、それが大きくなると、フレーム レートは許容レベルを下回ります。ユーザーがビュー (回転、ズーム) を変更し、フレーム レートが 60 fps に制限されている場合にのみ、シーンが常に再描画されるわけではありません。
まず、問題を特定します。フィル レートの制限またはピクセル シェーダーのスループットの制限 (すべてのフラグメントを処理するにはマルチプロセッサが少なすぎる) に達しているかどうかはわかりません。ピクセル シェーダーは何もせず、色を出力するだけですが、それでもプロセッサでコードが実行されるはずです。Optimus アーキテクチャの Nvidia 635m でこれを実行していますが、同様のモバイル GPU でこれを実行することが期待できます。それらのどれが問題であるかをどのように特定できますか?
そして、問題を特定した後の次のステップは、それを解決することです。一般に、オクルージョン フラグメント (部屋をレンダリングしてからその前に壁を配置した場合など) は多くないため、この点を最適化してもわずかな改善しかありません。フレームレートを改善する他の方法は何ですか?