イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

レンダリング、CommnadBuffer,G-Buffer,Deferred Shading(ディファードレンダリング)について

*細かいところを間違えてる気がしてならないです

 

++ディファードレンダリングの概要

レンダリングの手法の一つ。ライティング処理の負荷軽減のために使用される。

対比するものとしてフォワードレンダリングがある。

Deferred Shading,遅延シェーディングとも呼ぶ

 

++フォワードレンダリングとの比較

 結論だけいえば、ディファードレンダリングの方がライティング処理において、フォワードレンダリングよりも軽量であるが、半透明のオブジェクトを扱いにくい。半透明を扱うには工夫が必要。

ここ 66P以降が詳しい

マルチプルレンダーターゲットを使用するため古いGPUでは使えない、遅延ライティングを使わなければマテリアルを一つしか使えないなどの制約がある。またVRで利用するのはVR用の対応が必要っぽい。

 

詳しい説明の前にレンダリングパイプラインについて簡単に説明する。オブジェクトが画面上に映し出されるとき

 

ジオメトリ(頂点座標などのオブジェクトを表すデータ群)の入力=>

頂点シェーダ(頂点情報の操作)=>

ビューポート空間への座標変換=>

ラスタライザ(処理対象のピクセルを決定)=>

フラグメントシェーダ(ピクセル上の色情報の処理)=>

フレームバッファ

 

という順でこの処理が各頂点ごとに行われる。

このラスタライザまでの処理によって、どのピクセル(画素)に対して処理を行うかが決定され、その色付け処理がフラグメントシェーダによって実行されている。

 

(ラスタライザは渡された頂点情報を元に、ディスプレイ上のどのピクセルに描画すればよいのかを計算して画素を生成する。頂点間の辺や面を描画出来るのはこのラスタライザの機能によるもの。ラスタライズによって生成された画素のことをフラグメントと言う)

 

ライティングの処理はフォワードレンダリングの場合、フラグメントシェーダで行われる。ジオメトリ(頂点)ごとにライティング処理が行われ、またライトの数に応じてPass(レンダリング回数)が増えるため多くのライトを使うと負荷が問題になる。またライト数には負荷とか関係ない絶対的な制約数がある。

 また、ライトの当たってない部分までライティングの計算をしたりと無駄な処理が多い

 

ディファードレンダリングの場合は、フラグメントシェーダまでの処理をしたのち、一度フレームバッファというレンダリング結果を保存しておけるバッファにレンダリング結果を格納しておき、後にライティング等の処理を行う。ライトの数に関係なく常にピクセルごとに描画が行われる。ライティング処理の負荷はシーン中のライティング処理が行われるピクセル数に比例するため、負荷を軽くするには光を小さくすればいい。

 

++レンダーターゲット・フレームバッファ(やや自信がない

レンダリング先となるバッファ。レンダーターゲットとフレームバッファは実質同じもの。ただ描画先を意味する場合はレンダーターゲット、保存領域を意味する場合はフレームバッファ、というような使い分けがなされている。

フレームバッファGPUが保持する。

カラーバッファやデブスバッファ、ジオメトリバッファ(G-Buffer),コマンドバッファなど格納するデータに合わせて色々種類がある。

 

++マルチレンダーターゲット

一つのパス、つまり一回の描画で、複数のフレームバッファに書き込める機能。この機能がないとディファードレンダリングが出来ない

 同じ解像度のバッファに同じスクリーンに投影したポリゴンのみ使用できる

 

++G-Buffer

 G-buffer パスは、それぞれのオブジェクトを一度レンダリングします。Diffuse colors、specular colors、surface smoothness、world space normal と emission+ambient+reflections+lightmaps は、G-buffer テクスチャにレンダリングされています。G-buffer テクスチャはシェーダーにより、後のアクセスのためにグローバルシェーダーのプロパティーとして設定されています

ディファードシェーディングレンダリングパス - Unity マニュアル

ディファードレンダリングでよく使われるが、フォワードレンダリングでも使うことはできる。

 

++コマンドバッファ

グラフィックコマンドのリスト。

これを使用することで、任意のタイミングでレンダリングが可能になる。例えば、一度レンダリングしたのちに、その結果をテクスチャとして保存し、そのテクスチャにぼかしなどの追加処理をして再びレンダリングし画面に表示させるなど、レンダリング結果に対して追加処理を行うことが可能。

C#スクリプトでの処理が必要

 

++Pass

ShaderLab: Pass - Unity マニュアル

ジオメトリが一回描画される

 

++参考

Forward Rendering vs. Deferred Rendering

ディファードシェーディングレンダリングパス - Unity マニュアル

フォワードレンダリングパスの詳細 - Unity マニュアル

遅延シェーディング - Wikipedia

OpenGL が世界を描画する仕組み · けんごのお屋敷

床井研究室 - マルチプルレンダーターゲット

その9 マルチレンダーターゲットで異なる情報を一度に描いてみる

なぜなにリアルタイムレンダリング =>かなり詳しい

Rendering.CommandBuffer - Unity スクリプトリファレンス

GameObjectを使わないで2D描画 - Qiita

【Unity】CommandBuffer入門 - LIGHT11