遅延レンダリングエンジンのシーングラフ


10

学習課題として、遅延レンダリングエンジンを作成しました。このエンジンにシーングラフを追加したいのですが、その方法に少し戸惑っています。

通常の(フォワードレンダリングエンジン)では、すべての項目(すべてIDrawableとIUpdateAbleを実装)をシーングラフに追加するだけで、最初にシーングラフの幅を移動し、どこにでもDraw()を呼び出します。

ただし、遅延レンダリングエンジンでは、描画呼び出しを分離する必要があります。すべてを組み合わせる前に、まずジオメトリを描画し、次にシャドウキャスター、次にライト(すべて異なるレンダーターゲットに対して)を描画する必要があります。したがって、この場合、シーングラフ上を移動して、drawを呼び出すだけでは済みません。私の見方では、シーングラフ全体を3回移動して、描画する必要があるオブジェクトの種類を確認するか、何らかの方法で相互に接続された3つの個別のシーングラフを作成する必要があります。これらはどちらも貧弱なソリューションのようですが、シーンオブジェクトをより透明に処理したいと考えています。

私が考えていたもう1つの解決策は、通常どおりシーングラフを移動し、アイテムを3つの個別のリストに追加し、ジオメトリ、シャドウキャスター、ライトを分離し、これらのリストを反復して正しいものを描画することでした。フレームごとに3つのリストを再入力するのは賢明ですか?

回答:


6

私がC ++プロジェクトで使用したアプローチは、シーングラフ(空間インデックスを持つ)が現在の視錐台に基づいてヒットの「目に見える」std :: vectorを埋めることです。この可視リストはシーングラフによって管理されるため、カメラが移動したときにのみ再計算されます-グラフ内の移動オブジェクトはこのリスト内で移動され、必要に応じてソートされてマージされるトゥームストーンと未ソートの変更リストを使用します。

表示されるアイテムのリストは、最初にシェーダーIDでソートされ、各タイプ内ではカメラからの距離でソートされます。シェーダーIDは、テレインが最初に、次に建物、次にユニット、次に発射物、次にパーティクルというようにソートされるように割り当てられます。これはRTSです。一部のモデルには複数のシェーダーがありますが、それらはプライマリシェーダーのみを通知します。描画するように求められると、別のシェーダーで描画するビットが必要なものも、次のパスの単一リンクリストに追加されます。

したがって、描画は1つのパスで可視配列を通過し、その1つのパスで、再訪問する項目のリンクリストが作成され、2番目のパスなどが描画されます。

前面から背面に、不透明にしてから透明に描画すると、すべてを正常に保つことができます。

これはおそらくシェーダーの変更などの数を最小限に抑えているわけではありませんが、かなり実行可能で実装は簡単です。

XNAとこれがどのように適用可能か、そしてあなたが作成したこの低レベルのもののどれほど恐れているかについては、私にはまったくわかりません。ただし、ベテランがC ++ RTSのこのアプローチについてどう思うかを知ることは、最も興味深いことです。


こんにちは、私はこの答えが本当に好きです。特に、これまで考えてきたこととはまったく違うからです。あなたの方法は、特に半透明のオブジェクト(私はこれまでほとんど避けてきました)についても考えるとき、非常に正気のようです。訪問するオブジェクトのシーングラフから(リンクされた)リストを作成することは、非常に良い考えのようです。XNAでは、この低レベルの処理もすべて行う必要があります。
ロイT.

3

私の提案は、あなたが自分で説明したものと同様に、特定の要件に合わせて調整された2ステップのアプローチです。シーングラフと、レンダリングステップごとに "レンダリングコレクション"が必要です。この場合、シャドウ、ジオメトリ、ライト(おそらく4番目は透明なオブジェクトでしょうか?)

シーングラフは任意のタイプの関係に基づくことができますが、私の個人的な好みは、高速カリングを容易にするために各ノードに他のノードを含めることができる空間関係に基づいています。

レンダーコレクションは、特定のステップに合わせて調整された任意のタイプのデータ構造にすることができます。たとえば、シャドウコレクションは、初期zの拒否を最大化するために深さで並べ替えられたリストまたはツリーにすることができます。ジオメトリコレクションは、シェーダー(状態)の変更を最小限に抑えるために、シェーダーの使用法によって並べ替えることができます。ライトコレクションは、ライトの距離、サイズ、またはそれらの組み合わせでソートされたリストまたはツリーである可能性があるため、パフォーマンスが問題となる場合、ライトのレンダリングを最も効果的なライトのみに制限できます。

選択するデータ構造が何であれ、挿入操作が高速であることを確認し、プールなどの手法を使用してデータの割り当て/破棄を排除します。これは、これらのリストをフレームごとにクリアして埋めるからです。

これをすべて一緒に結ぶのは簡単です。シーングラフをウォークスルーして、各アイテムを関連するレンダーコレクションに追加するだけです。データ構造が要件に基づいて新しいエントリを自動的にソート/構造化する場合に役立ちます。完了したら、レンダーコレクションを必要な順序で実行してレンダリングします。

データ構造には高速な挿入があり、ガベージが生成されないため、前述のようにリストを再作成するペナルティはありません。

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