遅延レンダリングとは何ですか?


54

遅延レンダリングについて聞いたことがあり、それを使用するとパフォーマンスに大きな影響を与えずにシーン内のライトの「ロット」をどのように許容できるかを聞いたことがありますが、それは何であり、(高レベルから)どのように実装されていますか?

回答:


55

遅延レンダリングの特徴は、シーンレンダリングの複雑さをO(geometry * lights)からO(geometry + lights)に本質的に変更することです。

これは、(少なくとも)position *、normal、diffuse色などの基本的な属性を出力するように設計されたシェーダーを使用して最初にシーンをレンダリングすることで実現されます。その他の属性には、ピクセルごとの鏡面反射値およびその他のマテリアルプロパティが含まれる場合があります。これらは、Gバッファと総称されるフルスクリーンレンダーターゲットに保存されます。

(*:深さを利用できることは他の多くの効果に役立つため、開発者はより一般的に深さを格納し、それを使用して位置を再構築することを選択することに注意する価値があります。

Gバッファーが生成されると、BRDFをライトごとにピクセルごとに1回だけ解くことにより、画面上の任意のピクセルに対して完全に照らされた結果を計算することができます。言い換えると、それぞれが20のライトの影響を受ける20のメッシュがある場合、従来の(「フォワード」)レンダリングでは、各メッシュに影響する各ライトの結果を蓄積するために各メッシュを数回再レンダリングする必要があります。最悪の場合、これはライトごとのメッシュごとに1回の描画呼び出し、または合計400回の描画呼び出しになります!これらの描画呼び出しごとに、メッシュの頂点を重複して再変換します。また、実際にはライトの影響を受けないピクセルをシェーディングしたり、最終結果に表示されなかったりする可能性が高くなります(シーン内の他のジオメトリによって遮られるため)。これらはそれぞれ、無駄なGPUリソ​​ースになります。

遅延レンダリングと比較:Gバッファーにデータを入力するためにメッシュを一度レンダリングするだけです。その後、各ライトに対して、ライトの影響の範囲を表す境界形状をレンダリングします。ポイントライトの場合、これは小さな球体である場合があります。指向性ライトの場合、シーン全体が影響を受けるため、フルスクリーンクワッドになります。

次に、そのライトの境界ボリュームに対してピクセル/フラグメントシェーダーを実行するときに、Gバッファーテクスチャの適切な位置からジオメトリ属性を読み取り、それらの値を使用してライティング結果を決定します。最終結果で表示されるシーンピクセルのみがシェーディングされ、ライトごとに1回だけシェーディングされます。これにより、大幅に節約できる可能性があります。

ただし、欠点がないわけではありません。これは、透明なジオメトリを処理するために拡張するのが非常に難しいパラダイムです(深層剥離を参照)。実際、非常に難しいので、実質的にすべての遅延レンダリング実装は、シーンの透明部分のフォワードレンダリングにフォールバックします。遅延レンダリングは、大量のVRAMとフレームバッファー帯域幅も消費するため、開発者はGバッファー属性を可能な限り最小/最小のコンポーネントに巧みにパックおよび圧縮することになります。


8

遅延レンダリングとも呼ばれます。遅延レンダリングとは、中間結果をテクスチャに保存し、その後中間データをサンプリングすることでレンダリング方程式を完成させる可能なレンダリングパスの幅広いセットを指します。

ジオメトリバッファは初期の例で、シーンは、不透明なジオメトリの位置、法線、ベーステクスチャなどを含む一連のバッファにレンダリングされます。照明は適用されておらず、最終的な色は不明です。後続のパスでライトがレンダリングされ、ジオメトリバッファがサンプリングされます。これは、スクリーンピクセルに表示される可能性があるライトの固定コストで、多数のライトをレンダリングできることを意味します。従来のレンダリングでは、遮蔽されて画面に表示されなかった表面のすべての光源を評価していました。

たとえば光情報を最初にレンダリングするなど、多くのバリエーションがあります。

詳細については、 http ://en.wikipedia.org/wiki/Deferred_shading http://delicious.com/aancsiid/deferred-shadingを参照してください。


-3

遅延レンダリングは、geomtryがすべてをシェーディングするための2回目のパスを実行する前の処理です。複雑さをO(pixels * light sources)に変更し、パフォーマンスにわずかな影響しか与えない複雑なシーンを使用できるため、便利です。

実装はかなり簡単です。最初のパスでは、少なくとも距離、法線、色をレンダリングする必要があります。より多くのテクスチャを追加して、メモリを犠牲にして、鏡面反射や位置のようにレンダリングできます。

それらをレンダリングしたら、それぞれの中心に一意の光源があるいくつかの球体をレンダリングし、光を一緒に追加し、シーン内のジオメトリにすべてをトリミングして、最後にフォールオフを適用します。


これが答えに新しいものを追加するとは思わない。Neverenderの答えの一部を言い換えたように見えます。
HolyBlackCat

@HolyBlackCat重要な違いがいくつかあります。まず、正しい複雑さの方程式があり、次に、実際にそれを実際に実装する方法を説明しながら、はるかに簡潔です。
hellol11

there's the correct complexity equation本当です。しかし、それは些細なことだと思います。他の回答の編集としてそれを提案するか、十分な評判を得たらそれについてコメントを残すことができます。そのため新しい答えを出すのは少しやり過ぎです。it's much more concise個人的にはそれは良いとは思わない。回答の詳細が有用であればあるほど良いのではないでしょうか?
HolyBlackCat

1
@HolyBlackCatある程度、はい。個人的には、単純な質問に答えてもらうためだけにテキストの壁を通り抜けるのは好きではありません。
hellol11
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.