*細かいところを間違えてる気がしてならないです
++ディファードレンダリングの概要
レンダリングの手法の一つ。ライティング処理の負荷軽減のために使用される。
Deferred Shading,遅延シェーディングとも呼ぶ
結論だけいえば、ディファードレンダリングの方がライティング処理において、フォワードレンダリングよりも軽量であるが、半透明のオブジェクトを扱いにくい。半透明を扱うには工夫が必要。
ここ 66P以降が詳しい
マルチプルレンダーターゲットを使用するため古いGPUでは使えない、遅延ライティングを使わなければマテリアルを一つしか使えないなどの制約がある。またVRで利用するのはVR用の対応が必要っぽい。
詳しい説明の前にレンダリングパイプラインについて簡単に説明する。オブジェクトが画面上に映し出されるとき
ジオメトリ(頂点座標などのオブジェクトを表すデータ群)の入力=>
頂点シェーダ(頂点情報の操作)=>
ビューポート空間への座標変換=>
ラスタライザ(処理対象のピクセルを決定)=>
フラグメントシェーダ(ピクセル上の色情報の処理)=>
という順でこの処理が各頂点ごとに行われる。
このラスタライザまでの処理によって、どのピクセル(画素)に対して処理を行うかが決定され、その色付け処理がフラグメントシェーダによって実行されている。
(ラスタライザは渡された頂点情報を元に、ディスプレイ上のどのピクセルに描画すればよいのかを計算して画素を生成する。頂点間の辺や面を描画出来るのはこのラスタライザの機能によるもの。ラスタライズによって生成された画素のことをフラグメントと言う)
ライティングの処理はフォワードレンダリングの場合、フラグメントシェーダで行われる。ジオメトリ(頂点)ごとにライティング処理が行われ、またライトの数に応じてPass(レンダリング回数)が増えるため多くのライトを使うと負荷が問題になる。またライト数には負荷とか関係ない絶対的な制約数がある。
また、ライトの当たってない部分までライティングの計算をしたりと無駄な処理が多い
ディファードレンダリングの場合は、フラグメントシェーダまでの処理をしたのち、一度フレームバッファというレンダリング結果を保存しておけるバッファにレンダリング結果を格納しておき、後にライティング等の処理を行う。ライトの数に関係なく常にピクセルごとに描画が行われる。ライティング処理の負荷はシーン中のライティング処理が行われるピクセル数に比例するため、負荷を軽くするには光を小さくすればいい。
++レンダーターゲット・フレームバッファ(やや自信がない
レンダリング先となるバッファ。レンダーターゲットとフレームバッファは実質同じもの。ただ描画先を意味する場合はレンダーターゲット、保存領域を意味する場合はフレームバッファ、というような使い分けがなされている。
カラーバッファやデブスバッファ、ジオメトリバッファ(G-Buffer),コマンドバッファなど格納するデータに合わせて色々種類がある。
++マルチレンダーターゲット
一つのパス、つまり一回の描画で、複数のフレームバッファに書き込める機能。この機能がないとディファードレンダリングが出来ない
同じ解像度のバッファに同じスクリーンに投影したポリゴンのみ使用できる
++G-Buffer
G-buffer パスは、それぞれのオブジェクトを一度レンダリングします。Diffuse colors、specular colors、surface smoothness、world space normal と emission+ambient+reflections+lightmaps は、G-buffer テクスチャにレンダリングされています。G-buffer テクスチャはシェーダーにより、後のアクセスのためにグローバルシェーダーのプロパティーとして設定されています
ディファードシェーディングレンダリングパス - Unity マニュアル
ディファードレンダリングでよく使われるが、フォワードレンダリングでも使うことはできる。
++コマンドバッファ
グラフィックコマンドのリスト。
これを使用することで、任意のタイミングでレンダリングが可能になる。例えば、一度レンダリングしたのちに、その結果をテクスチャとして保存し、そのテクスチャにぼかしなどの追加処理をして再びレンダリングし画面に表示させるなど、レンダリング結果に対して追加処理を行うことが可能。
++Pass
ジオメトリが一回描画される
++参考
Forward Rendering vs. Deferred Rendering
ディファードシェーディングレンダリングパス - Unity マニュアル
フォワードレンダリングパスの詳細 - Unity マニュアル
その9 マルチレンダーターゲットで異なる情報を一度に描いてみる
なぜなにリアルタイムレンダリング =>かなり詳しい