現時点では、OpenGL を使用して Deferred Rendering を実装しましたが、これはかなり単純です。ただし、現在ステンシル パスを使用しているため (少なくとも現在の使用方法では)、パフォーマンスに大きな問題があります。私は主に ogldev.atspace のチュートリアル (投稿ごとに 2 つのリンクしかありませんでした。申し訳ありません!) を他の記事からの数十の情報とともに参照として使用してきました。
次のように機能します。
- Gbuffer パス (ジオメトリをレンダリングし、法線、拡散、アンビエントなどを塗りつぶす)
- 各ライト 2a) ステンシル パス 2b) ライト パス
- 画面に切り替え
この方法でステンシル パスを使用すると、シーン内のすべてのライトに対してライト パス モードとステンシル モードを切り替える必要があるため、膨大なコストが発生します。つまり、多くの GL 状態のスワップです。
ステンシル パスを使用しない別の方法は次のようになります。
- Gbuffer フィル
- ライトパスを設定
- すべてのライトの計算
- 画面に切り替え
これを行うと、シーン内の各ライトのすべての OpenGL 状態 (およびバッファーのクリアなど) を交換する必要がなくなります。
CodeXL と基本的な fps の std::cout'ng を使用して、これをテスト/プロファイリングしました。ステンシル パス メソッドを使用する状態変更関数は、私の GL 呼び出しの 44% を占めます (描画の場合は 6%、テクスチャの場合は 6% と比較して)、バッファ スワップ/クリアなどのコストもかなりの % 高くなります。2 番目の方法に行くと、GL 状態の変化は 2.98% に低下し、他の方法も同様にかなりのマージンを低下させます。FPS も大幅に変化します。たとえば、シーンに 65 個のライトがあり、動的に移動します。リリース モードで運が良ければ、ステンシル パスは約 20 ~ 30 fps を提供します (合計時間の大半をレンダリングに費やします)。2 番目の方法では 71~ になります (レンダリングにかかる時間は合計時間よりも短くなります)。
では、なぜ 2 番目の方法を使用しないのでしょうか。まあ、それは私が最初に得られない深刻な照明の問題を引き起こします. それらを取り除く方法がわかりません。次に例を示します。
2 番目の非ステンシル バージョン (基本的にブリードし、その範囲外のものにオーバーラップします): http://imgur.com/BNn9SP2
最初のステンシル バージョン (どのように見えるか): http://imgur.com/kVGRwH2
私の主な質問は、タイル化された遅延レンダリングのようなものにアルゴリズムを完全に変更せずに、ステンシル パスの使用を回避する方法 (およびグラフィック グリッチなしで最初のものと同様のものを使用する方法) があるかどうかです。
そうでない場合、それらは代替の遅延レンダリング方法ですか?それは、私が使用している遅延レンダラーのスタイルからあまりジャンプしていませんか?
ステンシル パスを取り除くことは、私にとって新しい問題ではありません。最初に実装した 6 か月ほど前に、これに代わるものを探していましたが、私が持っていたものに対してオーバーヘッドが少し大きすぎるのではないかと考えていました。念頭に置いて。しかし、私はその時何も見つけることができず、今でも見つけることができません。