多くの光源を使用した効率的なレンダリング


10

フォンシェーディングを使用して単一の光源でシーンをレンダリングするには、マテリアルと光源の両方のアンビエント/拡散/鏡面反射光コンポーネントに基づいて、フラグメントシェーダーに渡される各フラグメントの最終的な色を計算できます。

これは、個々の光源をフラグメントに適用した結果を次のように追加することで、複数の光源に対応するように簡単に拡張できます。

final_color = (0, 0, 0, 1)
for each light:
    final_color += apply_light(material, light)
final_color = clamp(final_color, (0,0,0,1), (1,1,1,1))

ただし、光源の数が非常に多い場合、このプロセスは非常に遅くなります。でN点灯し、このアプローチが行われるシェーディングフォンのための計算が必要ですNフラグメントあたりの回。

非常に多数の光源(数百、数千など)でシーンをレンダリングするためのより良いアプローチはありますか?

回答:


15

はい、しかしパラダイムシフトが必要です。

慣れているものをフォワードレンダリングと呼びます。ジオメトリを送信し、すぐにシェーディングパスに進みます。基本的なフォワードレンダリングでは、各ライトのシェーダー内でループするか、ライトごとに1つのパスを実行して、結果をブレンドします(加算ブレンドを使用)。

しかし、物事はかなり進化しました。入力:遅延レンダリング

これで、それらを詳細に説明する非常に多くのバリアントが、ここでの回答に受け入れられる以上の方法になります。したがって、ここでは遅延シェーディングの要点について説明します。他にも、googleを使用して簡単に見つけられるリソースがたくさんあります。これを読んだ後、必要なものを見つけるための適切なキーワードが得られることを願っています。

基本的な考え方は、シェーディングをパイプラインの後まで延期することです。あなたは2つの主要なステップがあります:

  1. ジオメトリと、複数のレンダーターゲットへのシェーディングに必要なすべての情報をレンダーします。これは通常、基本的な実装では、深度バッファー、ジオメトリの法線とアルベドカラーを含むバッファーがあることを意味します。すぐに、材料に関するその他の情報(粗さ、「金属」係数など)が必要になることがわかります。

ウィキペディアのこの画像は、3つのバッファー(色、深度、法線)を示しています

ここに画像の説明を入力してください

この場合も、使用されるバッファの量、タイプ、および内容は、プロジェクトによって大きく異なります。GBuffersという名前の一連のバッファが見つかります。

  1. この後、実際の照明を適用します。各ライトのライティングパス中に、ライトのタイプに応じたライトボリュームを描画します。
    • 指向性ライトの場合は、フルスクリーンのクワッドをレンダリングします。
    • ポイントライトの場合、半径がポイントライトの減衰に基づく球をレンダリングします。
    • スポットライトの場合、コーンをレンダリングしますが、その寸法はライトの特性に依存します。

このパスのピクセルシェーダーでは、GBufferを渡し、それらの情報を使用してライティングとシェーディングを実行します。このようにして、従来のフォワードレンダリングと比較した場合に、かなりのスピードアップを持つ各ライトの影響を受けるピクセルのみを処理します。

また、さまざまな欠点、特に透明オブジェクトの処理、帯域幅とビデオメモリの消費量の増加などがあります。しかし、材料のさまざまなモデルを処理するのも難しいです。

あなたには他の副次的な利点があり(多くの情報が後処理の準備ができているなど)、実装も非常に簡単です。しかし、これはもはや多くのライトにとって最もクールなことではありません。

新しい手法は、たとえばタイルレンダリングなどです。それらの主なアイデアは、画面空間の「タイル」でシーンを分割し、各タイルに影響を与えるライトを割り当てることです。これは、据え置きとフォワードの両方の方法で存在します。これらの手法は、タイルにさまざまな深さの不連続がある場合にいくつかの問題を引き起こしますが、一般的には、従来の遅延よりも高速であり、さまざまな問題を解決します。たとえば、利点の1つとして、タイル化された据え置きでは、点灯フラグメントごとに1回GBuffersを読み取り、同じタイル内のピクセルが同じライトをコヒーレントに処理します。

この面でのさらなる進化は、タイルベースのアプローチと概念的に同様であり、画面スペースタイルの代わりに3D範囲のクラスターを持つクラスターシェーディングです。この方法は、深さの不連続性の問題をより適切に処理し、一般にタイル方式よりもパフォーマンスが向上します。

重要な注意:遅延シェーディングの基本について説明しました。複数のバリエーション、最適化、改善点がありますので、簡単なバージョンを試してから、上記で述べたような他の手法について調査することをお勧めします。


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