このページでは、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 を使っていないとき、エミッションとライティングバッファ (RT3) は対数的にコード化され、ARGB32 テクスチャで通常可能であるよりも大きなダイナミックレンジを提供します。
カメラが HDRレンダリングを使用するとき、エミッション + ライティングバッファ (RT3) のために別のレンダーターゲットは作成されません。代わりに、カメラがレンダリングするレンダーターゲット (これがイメージエフェクトに渡されます) が RT3 として使用されます。
G バッファパスは、それぞれのゲームオブジェクトを 1 度レンダリングします。ディフューズ色、スペキュラー色、サーフェスのスムースネス 、ワールド空間法線と、エミッション + アンビエント + リフレクション + ライトマップは、G バッファテクスチャにレンダリングされます。G バッファテクスチャはシェーダーにより、後のアクセスのためにグローバルシェーダーのプロパティとして設定されます( CameraGBufferTexture0 から CameraGBufferTexture3 )。
ライティングパスは、G バッファと深度に基づいてライティングを計算します。ライティングはスクリーンスペースで計算されます。そのため、処理にかかる時間はシーンの複雑さに依存しません。ライティングはエミッションのバッファに追加されます。
カメラのニアクリップ面と交差しないポイントライトやスポットライトは、シーンに対する Z バッファのテストを有効にして、3D 形状としてレンダリングされます。これにより一部あるいは全体が塞がれたポイントライトやスポットライトのレンダリングの負荷は、非常に軽くなります。ニアクリップ面と交差するディレクショナルライト、ポイントライト、スポットライトはフルスクリーンの四角形としてレンダリングされます。
ライトの影が有効化されている場合、それらもこのパスでレンダリングされ適用されます。影をレンダリングするのにも負荷がかかります。シャドウキャスター (影の投影元) もレンダリングされる必要があり、より複雑なライトシェーダーも適用される必要があります。
使用できる唯一のライティングモデルは Standard (標準) です。別のモデルを使用したい場合は、ビルトインシェーダー変数 の Internal-DeferredShading.shader ファイルの修正バージョンを、Assets フォルダーの Resources という名前のフォルダーに配置して、ライティングパスシェーダーを変更できます。次に Graphics (グラフィックス) 設定を開きます (Edit > Project Settings を選択し、Graphics カテゴリをクリック) “Deferred” (ディファード) ドロップダウンを “Custom Shader” (カスタムシェーダー) に変更します)。次に、使用しているシェーダーに表示されるシェーダーオプションを変更します。
2017–06–08 公開ページ
Light Modes (Shadowmask と Distance Shadowmask) 5.6 に追加
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.