2013-06-21 17 views
8

私は現在、OpenGLレンダリングエンジンのアップグレードと再構築に取り組んでいます。エンジンは、建築データの大きなシーン(内部の建物)を視覚化するために使用され、オブジェクトの量はかなり大きくなる可能性があります。どの建物でもそうですが、壁には多くの遮蔽物があり、同じ部屋にあるものだけを見ることができます。また、外にいる場合は外装も見ることができます。これは、閉塞カリングおよび錐台カリングによって閉塞されるべき多数の物体を残す。最新の状態でレンダリングのカリングとバッチ処理技術

同時に、レンダリングでバッチ処理できる多くの繰り返しジオメトリと、インスタンス化されたレンダリングでレンダリングできる多くのオブジェクトがあります。

レンダリングのバッチ処理とカリングを最適な方法で組み合わせることは困難です。同じVBO内に多数のオブジェクトをバッチすると、そのバッチのレンダリングをスキップするためにCPU上のオブジェクトを削除することは困難です。同時に、CPU上での間抜けをスキップすると、多くのオブジェクトがGPUによって処理され、表示されません。 CPUをより簡単に取り除くためにバッチ処理をスキップすると、不要なレンダリングコールが大量に発生します。

私は、現代のグラフィックスでこれらの問題がどのように解決されているかについて、既存のテクニックや理論を研究しましたが、具体的な解決策を見つけることはできませんでした。同僚と私が思いついたアイデアは、お互いに比較的近いオブジェクトにバッチを制限することでした。これは、オクトツリーを使用することによって、単純化および最適化することができます。

現代グラフィックスエンジンの最新の状態でシーン管理、カリング、バッチ処理などに使用されるテクニックを指す人はいませんか?

+0

私は、現代グラフィックエンジンの最先端技術に関する知識がないと言って始めましょう。しかし、これは単一の解決策がない問題のように思えます。代わりに、パッチ適用と複数のアプローチを切り替えて、与えられたシナリオで最高の品質/パフォーマンスを提供することで解決できます。圧迫されると、品質と性能は常に相互に排他的です。私は通常、テクスチャ配列やその他のものを使用して、静的アーキテクチャ環境で非常に役立つことができます。 –

答えて

5

インターネットには、錐体と咬合の淘汰に関する多くの情報があります。 ほとんどのものはゲーム開発者のものです。 ここであなたを得る始めたいくつかの記事のリストです:

私(かなり速い)レンダラは次のように動作します:

  1. コレクションは:レンダラに、あなたがレンダリングしたいすべての小道具を、送信します。
  2. フラストゥームカリング:レンダラは、複数のスレッドを並行して使用して、リストから不可視プロップをリストから削除します。
  3. オクルージョンカリング:今では、CPUをオクルージョンカリングすることができました(私はまだそれを実装していません、私は今必要ないので)。それを効率的に行う方法の詳細については、KillzoneおよびCrysisスライドに記載されています。 1つの解決策は、前のフレームのデプスバッファをGPUから読み戻し、その上にあるオブジェクトの境界ボックスをラスタライズして、そのオブジェクトが見えるかどうかをチェックすることです。
  4. 分割:実際にどのオブジェクトをレンダリングする必要があるかは、表示されているので、メッシュごとに分割する必要があります。メッシュごとに素材やテクスチャが異なるためです(そうでない場合は、メッシュ)。
  5. バッチ処理:レンダーするメッシュのリストがあります。あなたはそれらを並べ替えることができます:
    • (これはメッシュレベルの代わりにプロップレベルで行うことができます)、充填率を保存するために(私はあなたのフラグメントシェイダーが非常に単純な場合はこれを行うことはお勧めしません)。
    • メッシュ(同じメッシュの複数のインスタンスが存在する可能性があり、インスタンシングの追加が容易になるため)テクスチャスイッチは非常に高価であるため、テクスチャによる調整が必要です。
  6. レンダリング:分割されたメッシュを繰り返してレンダリングします。

「フルフロントヌード」とは既に言われました。完璧な解決策はありません。

関連する問題