このページでは、Unity のビルトインレンダーパイプラインのディファードシェーディング レンダリングパス について説明します。ディファードシェーディングの基本的な技術概要は、ウィキペディア: 遅延シェーディング (ディファードシェーディング) を参照してください。
ディファードシェーディングを使用する場合、ゲームオブジェクトに影響を与えるライトの数に制限はありません。すべてのライトがピクセルごとに評価されるため、ライトはすべて法線マップなどと正しく相互作用します。さらに、すべてのライトにクッキーと影を設定することができます。
ディファードシェーディングには、ライティングの処理オーバーヘッドがライトの照らすピクセル数に比例するという利点があります。処理オーバーヘッドはゲームオブジェクトを照らす数に関係なく、シーン内のライトのボリュームのサイズによって決まります。したがって、パフォーマンスは、ライトを小さくすることで向上します。また、ディファードシェーディングは非常に一貫性のある予測可能な動作をします。各ライトの効果はピクセルごとに計算されるので、大きな三角形でライティングの計算に失敗してしまうことはありません。
不利な点としては、ディファードシェーディングはアンチエイリアスを事実上サポートしておらず、半透明のゲームオブジェクトを処理できないことです (これらには、フォワードレンダリング を使用します)。また、メッシュレンダラーの Receive Shadows フラグがサポートされず、カリングマスクのサポートには制限があります。カリングマスクの使用は 4 つまでに限られています。つまり、カリングレイヤーマスクには、すべてのレイヤー数から 4 つの任意のレイヤーを引いた数のレイヤーが含まれます。よって、32 レイヤーなら 28 レイヤーを設定しなければなりません。これに従わない場合、グラフィカルなアーティファクトが発生します。
Multiple Render Targets (MRT)、Shader Model 3.0 (またはそれ以降)、深度レンダーテクスチャへのサポートを伴うグラフィックスカードが必要です。2006 年以降に作られた GeForce 8xxx、Radeon X2400、Intel G45 などをはじめとする、ほとんどの PC グラフィックスカードはディファードシェーディングをサポートします。
モバイルでは、ディファードシェーディングは、最低 OpenGL ES 3.0 を実行するすべてのデバイスでサポートされます。
ノート: 平行投影の使用中は、ディファードレンダリングはサポートされません。カメラの投影モードが平行投影に設定されている場合、カメラはフォワードレンダリングにフォールバックします。
ノート: ディファードレンダリングは、ビルトインレンダーパイプラインのシングルパスステレオインスタンシングをサポートしません。
ディファードシェーディングでは、リアルタイムライトのレンダリングのオーバーヘッドは、ライトが照らすピクセル数に比例し、シーンの複雑さには 依存しません。そのため、小さなポイントライトやスポットライトをレンダリングする際の負荷は非常に軽く、それらがすべて、または部分的にシーンのゲームオブジェクトによって塞がれる場合はさらに負荷が軽くなります。
当然、影のないライトよりも影のあるライトのほうがはるかに負荷が高くなります。ディファードシェーディングでは、影を落とすゲームオブジェクトは、影を投影するライトごとに 1 回以上レンダリングされる必要があります。さらに、影を適用するライティングシェーダーは、影を無効化した場合と比べて、レンダリングオーバーヘッドが大きくなります。
ディファードシェーディングをサポートしないシェーダーを持つオブジェクトは、ディファードシェーディングが終了した後に フォワードレンダリング パスを使ってレンダリングされます。
G バッファのレンダーターゲット (RT0 - RT4) のデフォルトレイアウトを以下にリストします。データタイプは、各レンダーターゲットの様々なチャンネルに配置されます。使用されるチャンネルはかっこ内に表示します。
つまり、デフォルトの G バッファレイアウトは、160 ビット/ピクセル (非 HDR) または、192 ビット/ピクセル (HDR) になります。
混合ライティングに Shadowmask または Distance Shadowmask モードを使用する場合は、5 番目のターゲットを使用します。
つまり、G バッファレイアウトは、192 ビット/ピクセル (非 HDR) または、224 ビット/ピクセル (HDR) になります。
ハードウェアが 5 つのレンダーターゲットを同時にサポートしない場合は、シャドウマスクの使用がフォワードレンダリングパスの代案です。カメラが HDR を使っていないとき、Emission とライティングバッファ(RT3)は、ARGB32 テクスチャで通常可能であるよりも大きなダイナミックレンジを提供するために対数的にコード化されます。
カメラが HDRレンダリングを使用するとき、エミッション + ライティングバッファ (RT3) のために別のレンダーターゲットは作成されません。代わりに、カメラがレンダリングするレンダーターゲット (これがイメージエフェクトに渡されます) が RT3 として使用されます。
G バッファパスは各ゲームオブジェクトを一度レンダリングします。ディフューズ色とスペキュラー色、表面の滑らかさ、ワールド空間法線、発光 + アンビエント + リフレクション + ライトマップは、G バッファテクスチャにレンダリングされます。G バッファテクスチャは、後でシェーダーからアクセスできるようにグローバルシェーダープロパティとして設定されます (CameraGBufferTexture0 .. CameraGBufferTexture3)。
ライティングパスは、G バッファや深度に基づいてライティングを計算します。ライティングは、スクリーンスペースで計算するので、処理に要する時間はシーンの複雑さには関係ありません。ライティングは発光バッファに加えられます。
カメラのニアクリップ面と交差しないポイントライトやスポットライトは、シーンに対する Z バッファのテストを有効にして、3D 形状としてレンダリングされます。これにより一部あるいは全体が塞がれたポイントライトやスポットライトのレンダリングの負荷は非常に少なくなります。ニアクリップ面と交差するディレクショナルライト、ポイントライト、スポットライトは全画面のクアッドとしてレンダリングされます。
ライトで影が有効になっている場合、このパスで影もレンダリングされ適用されます。影は負荷を増やすため注意してください。影を投影するにはレンダリングする必要があり、より複雑なライトシェーダーを適用する必要があります。
使用可能なライティングモデルは Standard のみです。別のモデルが必要な場合は、ライティングパスシェーダーを変更できます。変更したバージョンの Internal-DeferredShading.shader ファイルを ビルトインシェーダー から “Assets” フォルダー内の “Resources” フォルダーに配置します。次に、Graphics 設定 (メニュー: Edit > Project Settings から Graphics カテゴリを選択) を開きます。“Deferred” ドロップダウンを “Custom Shader” に変更します。使用しているシェーダーに表示されるシェーダーオプションを変更します。
2017–06–08
ライトモード (Shadowmask と Distance Shadowmask) を 5.6 に追加