9

私は現在、OpenGL レンダリング エンジンのアップグレードと再構築に取り組んでいます。このエンジンは、建築データの大規模なシーン (インテリアのある建物) を視覚化するために使用され、オブジェクトの量がかなり大きくなる可能性があります。どの建物でもそうであるように、壁の中に遮られたオブジェクトがたくさんあり、同じ部屋にあるオブジェクト、または外にいる場合は外にあるオブジェクトしか見えません。これにより、オクルージョン カリングとフラスタム カリングによってオクルードされるべき多数のオブジェクトが残ります。

同時に、レンダーバッチでバッチ処理できる反復ジオメトリが多数あり、インスタンス化されたレンダリングでレンダリングできるオブジェクトも多数あります。

私の見方では、レンダーバッチ処理とカリングを最適な方法で組み合わせるのは難しい場合があります。同じ VBO であまりにも多くのオブジェクトをバッチ処理すると、そのバッチのレンダリングをスキップするために CPU 上のオブジェクトを選別することが難しくなります。同時に、CPU でのカリングをスキップすると、多くのオブジェクトが見えない間に GPU によって処理されます。CPU をより簡単に選別するためにバッチ処理を完全にスキップすると、不要な大量のレンダー コールが発生します。

これらの問題が現代のグラフィックスでどのように解決されるかについて、既存の技術と理論についていくつかの調査を行いましたが、具体的な解決策を見つけることができませんでした。同僚と私が思いついたアイデアは、バッチを互いに比較的近いオブジェクトに制限することでした。たとえば、部屋内または半径 n 人以内のすべての椅子です。これは、oct-tree を使用することで簡素化および最適化できます。

最先端のグラフィックエンジンでシーン管理、カリング、バッチ処理などに使用される手法へのポインターはありますか?

4

1 に答える 1

6

インターネット上には、フラスタムとオクルージョンのカリングに関する情報がたくさんあります。そのほとんどはゲーム開発者からのものです。開始するためのいくつかの記事のリストを次に示します。

私の(かなり高速な)レンダラーは次のように機能します。

  1. Collection : レンダリングするすべての小道具をレンダラーに送信します。
  2. Frustum culling : レンダラーは、複数のスレッドを並行して使用して、リストから目に見えないプロップをカリングします。
  3. オクルージョン カリング: CPU でオクルージョン カリングを実行できるようになりました (今は必要ないため、まだ実装していません)。効率的に行う方法の詳細については、Killzone と Crysis のスライドをご覧ください。1 つの解決策は、GPU から前のフレームの深度バッファーを読み戻し、その上にあるオブジェクトの境界ボックスをラスタライズして、オブジェクトが表示されているかどうかを確認することです。
  4. 分割: どのオブジェクトを実際にレンダリングする必要があるかがわかったので、それらが表示されているため、メッシュごとに分割する必要があります。これは、各メッシュが異なるマテリアルまたはテクスチャを持っているためです (そうしないと、単一のメッシュに結合されます)。
  5. バッチ処理: これで、レンダリングするメッシュのリストができました。それらを並べ替えることができます:
    • 深度ごとに (これはメッシュ レベルではなくプロップ レベルで実行できます)、フィルレートを節約します (フラグメント シェーダーが非常に単純な場合は、これを行うことはお勧めしません)。
    • メッシュごと (同じメッシュの複数のインスタンスが存在する可能性があり、インスタンス化を簡単に追加できるため)。
    • テクスチャの切り替えは非常にコストがかかるためです。
  6. レンダリング: 分割されたメッシュを反復してレンダリングします。

そして、「全正面ヌード」ですでに述べたように、完璧な解決策はありません。

于 2014-05-02T12:23:16.077 に答える