Custom Pass の作成
Custom Pass (カスタムパス) を作成するには、GameObject > Volume > Custom Pass を使って、シーンにカスタムパスボリュームコンポーネントを追加します。これにより Custom Pass Volume を含むカスタムパスと呼ばれるゲームオブジェクトが作成されます。このコンポーネントを使うと、カスタムパスの作成および設定ができます。
Custom Pass Volume コンポーネントプロパティー
プロパティー | 説明 |
---|---|
Mode | ドロップダウンから、Unity が Custom Pass Volume が Camera に影響を与えるかを決定するために使うメソッドを選択します: • Global: Custom Pass Volumeに境界線はなく、シーンのすべての Camera に影響します。 • Local: Custom Pass Volume に境界線を特定し、その境界線内の Camera のみに影響を与えるようにします。境界線は、Collider を Custom Pass Volume のゲームオブジェクトに追加して設定します。 |
Injection Point | ドロップダウンを使い、Unity が HDRP レンダーループで Custom Pass をいつ実行するかを定義します。 各投入ポイントに関する詳細は、Injection Point を参照してください。 |
Priority | 同じ投入ポイントに1つ以上の Custom Pass Volume が割り当てられている場合は、このプロパティーを使って Unity が実行順位を制御します。 Unity は 0 から Priority の順番に従ってこれらの Volume を実行します。 |
Fade Radius | Volume にアプローチする際に、Unity がいつ Custom Pass のエフェクトでフェードを開始するかを定義します。 値が 0 であれば、HDRP はこの Volume のエフェクトを Volume のすぐ隣に適用します。値が高ければ、エフェクトが Volume から離れたところで現れることを意味します。 このプロパティーは、Mode が Local に設定されているときのみ表示されます。 |
Custom Pass | 追加 (+) ボタンをクリックし、Custom Pass を作成します。Custom Pass Volume コンポーネントには、デフォルトで次のタイプの Custom Pass があります。 • FullScreen Custom Pass: これを使って Unity が Camera ビューに適用する、または Custom Pass バッファに保存するエフェクトを実行するします。詳細は Full-screen Custom Pass を参照してください。 • DrawRenderers Custom Pass: Custom Passを Camera ビューにあるゲームオブジェクトに適用するために使います。詳細は Draw Renderers Custom Pass を参照してください。 独自の Custom Pass を作成する場合も、このドロップダウンに表示されます。詳細は C# で独自の Custom Pass をスクリプティングする を参照してください。 このコンポーネントに複数の Custom Pass がある場合は、 **-** をクリックすると削除できます。 |
Full Screen Custom Pass
Full Screen Custom Pass は、エフェクトを画面全体に適用します。これを実現するために、Full Screen Custom Pass 用に設定されたマテリアルを使ってフルスクリーンクアッドをレンダリングし、画面上のすべてのピクセルにフラグメントシェーダーを実行します。
Full Screen Custom Pass を作成するには、Custom Pass Volume コンポーネントの右下にある追加 (+) ボタンをクリックし、 FullScreeenCustomPass を選択します。
FullScreenCustomPass プロパティー
Full Screen Custom Pass の設定には、Custom Pass パネルで以下のプロパティーを使います。
プロパティー | 説明 |
---|---|
Name | このフィールドでは Custom Pass に名前を付けます。Unity はこの名前を使い Profiler の Custom Pass Volume を参照します。 |
Target Color Buffer | Unity がカラーデータを書くバッファを選択します。 Camera: Custom Pass をレンダリングする現在のカメラカラーバッファをターゲットにします。 Custom: HDRP アセットに割り当てられた Custom Pass Buffer を使います。 None: バッファにデータは書き込みません。 Fetch Color Buffer が有効になっている場合は、カラーデータを Camera カラーバッファに書き込むことはできません。 Target Color Buffer および The Target Buffer の両方が None に設定されている場合、レンダリングするバッファがないので Unity は Custom Pass を実行しません。 |
Target Depth Buffer | Unity が深度およびステンシルデータを書きテストするバッファを選択します。 このバッファは シェーダープロパティー で有効化された Depth Write を持つ透明オブジェクトを含みません。 Target Color Buffer および The Target Buffer の両方が None に設定されている場合、レンダリングするバッファがないので Unity は Custom Pass を実行しません。 |
Clear Flags | クリアフラグは、Unity が Custom Pass を実行する前に、バッファのコンテンツを破棄します。 このプロパティーはクリアフラグを次のバッファの 1 つに割り当てます。 None: このパスでバッファを消去しません。 Color: 深度バッファを消去します。 Depth: 深度バッファとステンシルバッファを消去します。 All: カラー、深度、ステンシルバッファのデータを消去します。 |
Fetch Color Buffer | このチェックボックスを有効にすると、Custom Pass がカラーバッファからデータを読み込めるようになります。 これは Multi-sample Anti-aliasing (MSAA) が有効なときも、適用します。 Fetch Color Buffer および MSAA が有効化されると、生成するカラーバッファを強制し、Custom Pass は次の投入ポイントの1つを使います。 Before PreRefraction Before Transparent After Opaque Depth And Normal Custom Pass は同じレンダーターゲットに読み込みまたは書き込みすることはできません。つまり、同時に Fetch Color Buffer を有効にして Target Color Buffer を使うことはできません。 |
FullScreen Material | Custom Pass がシーンでレンダリングするマテリアルです。 |
Pass Name | Unity がフルスクリーンクアッドを描画するために使う、シェーダー Pass Name を選択します。 |
Full Screen Custom Passs と一緒に使うマテリアルの作成
Full Screen Custom Pass を使うためには、シーンで使う Custom Pass にシェーダーを作成する必要があります。Unity には Full Screen Custom Pass 向けに、特定のシェーダータイプが用意されています。互換性のあるシェーダーを作成する方法は次の通りです。
- Full Screen Custom Pass を作成します。まず、Assets > Create > Shader > HDRP > Custom FullScreen Pass に行きます。
- Hierarchy に行き Custom FullScreen Pass シェーダーを右クリックし、Create > Material を選択します。Unity が “FullScreen_” のプレフィックスが付いた新しいマテリアルを作成します。
- Custom Pass コンポーネントで、
**+**
をクリックし Custom Pass を作成し、FullScreenCustomPass を選択します。 - FullScreen Material ボックスの右側にあるアイコンを使ってマテリアルピッカーを開き、“FullScreen_...” マテリアルを選択して、このマテリアルを FullScreenCustomPass に割り当てます。
- Custom Passes が複数ある場合は、パスに使いたい Pass Name を選択します。
Full Screen Custom Passs の Unity シェーダーを編集する
Unity が Full Screen Custom Pass と使えるマテリアルを作成する際、Unity シェーダー用のデフォルトのテンプレートコードを追加します。
Unity シェーダーを編集する方法は次の通りです。
- Assets ウィンドウでマテリアルを選択します。
- Inspector に移動します。
- Open をクリックします。
Unity シェーダーソースファイルには以下の FullScreenPass
メソッドが含まれます。Full Screen Custom Pass 用のカスタムシェーダーコードは、ここで追加できます。
float4 FullScreenPass(Varyings varyings) : SV_Target
{
float depth = LoadCameraDepth(varyings.positionCS.xy);
PositionInputs posInput = GetPositionInput(varyings.positionCS.xy, _ScreenSize.zw, depth, UNITY_MATRIX_I_VP, UNITY_MATRIX_V);
float3 viewDirection = GetWorldSpaceNormalizeViewDir(posInput.positionWS);
float4 color = float4(0.0, 0.0, 0.0, 0.0);
// 現在BeforeRendering 投入ポイントになければ、カメラカラーバッファをミップ 0 で読み込む
if (_CustomPassInjectionPoint != CUSTOMPASSINJECTIONPOINT_BEFORE_RENDERING)
color = float4(CustomPassLoadCameraColor(varyings.positionCS.xy, 0), 1);
// ここにカスタムパスコードを追加する
// フェード値を使い、カメラがカスタムパスボリュームに近づくにつれ、エフェクトの強度を増加できる
float f = 1 - abs(_FadeValue * 2 - 1);
return float4(color.rgb + f, color.a);
}
FullScreenPass メソッドは以下の入力データを読み込みます。
- 深度
- ビュー方向
- ワールド空間の位置
- カラー
FullScreenPass
メソッドには _FadeValue
変数も含まれており、Camera が Custom Pass Volume に近づくにつれ、エフェクトの強度を増加させることができます。この変数は Fade Radius が割り当てられた、ローカルの Custom Pass Volume のみに作用します。
Draw renderers Custom Pass
Draw Renderers Custom Pass は、エフェクトを Camera ビューにあるゲームオブジェクトに適用するために使います。
また、この Custom Pass は、HD Camera 内の Culling Mask ドロップダウンプロパティーにあるオプションを使って、エフェクトをカメラビューの外側にあるオブジェクトに適用することも可能です。
Draw Renderers Custom Pass を作成するには、Custom Pass Volume コンポーネントにある追加 (+) ボタンをクリックしてから DrawRenderersCustomPass を選択します。
Draw renderers Custom Pass プロパティー
Draw renderers Custom Pass の設定には、Custom Pass パネルで次のプロパティーを使います。
プロパティー | 説明 |
---|---|
Name | このフィールドでは Custom Pass に名前を付けます。Unity はこれを、デバッグのプロファイリングマーカーとして使います。 |
Target Color Buffer | Unity がカラーデータを書くバッファを選択します。 Camera: Custom Pass をレンダリングする現在のカメラカラーバッファをターゲットにします。 Custom: HDRP Asset に割り当てられた Custom Pass バッファを使います。 None: バッファにデータは書き込みません。 |
Target Depth Buffer | Unity が深度およびステンシルデータを書きテストする、ターゲットバッファ: Camera: Custom Pass をレンダリングする現在のカメラ深度バッファをターゲットにします。 Custom: HDRP Asset に割り当てられた Custom Pass バッファを使います。 None: バッファにデータは書き込みません。 このバッファは シェーダープロパティー で有効化された Depth Write を持つ透明オブジェクトを含みません。 |
Clear Flags | フラグ消去は、Unity が Custom Pass を実行する前に、バッファのコンテンツを破棄します。 このプロパティーはフラグ消去を次のバッファの1つに割り当てます。 None: このパスでバッファを消去しません。 Color: 深度バッファを消去します。 Depth: 深度バッファとステンシルバッファを消去します。 All: カラー、深度、そしてステンシルバッファのデータを消去します。 |
Filters | このセクションでは、Unity が Custom Pass でレンダリングするゲームオブジェクトを決定します。 |
Queue | Custom Pass がレンダリングするマテリアルの種類を選択します。 |
Layer Mask | Custom Pass が適用するゲームオブジェクトのレイヤーを選択します。 |
Overrides | |
Material | Custom Pass に含まれる、すべてのマテリアルをオーバライドするために Custom Pass Volume が使うマテリアルを選択します。 このフィールドは Unlit Shader Graph、Unlit HDRP Unity シェーダー、または Lit シェーダーを受け付けます。互換性のあるマテリアルの完全リストは、マテリアルと投入ポイントの互換性 を参照してください。 Draw Renderer Custom Pas と互換性のある Unity シェーダーは、メニューから Create > Shader > HDRP > Custom Renderers Pass を使って作成できます。 |
Pass Name | このフィールドはマテリアルを Material フィールドに割り当てると表示されます。このフィールドのドロップダウンオプションは、Material フィールドに割り当てたマテリアルに応じて変わります。 Unity がフルスクリーンクアッドを描画するために使う Custom Pass を選択します。複数の Custom Pass エフェクト間の切り替えにこれを使うことができます。 |
Override Depth | このチェックボックスを有効にすると、レンダリングされたゲームオブジェクトのマテリアル内で深度レンダーステートをオーバライドします。 これにより、デフォルトの Depth Test 値を置き換え、カスタム値で深度を書くことが可能になります。 |
Depth Test | Unity はゲームオブジェクトをレンダリングする際、Depth Test 値を使って、別のオブジェクトの後ろに隠れていないかを確認します。このために Unity は与えられたゲームオブジェクトのピクセルの z 値 (深度) をテストして、深度バッファに保存された値と比較します。 デフォルトにより、Depth Test は Less Equal にされており、元のオブジェクトはテスト対象であるオブジェクトの前に表示されます。ドロップダウンから深度テストに使う比較メソッドを選択します。比較メソッドはそれぞれ、Shader のレンダリング方法を変更します。 Disabled: 深度テストを実行しません。 Never: 決して深度テストにパスしません。 Less: ピクセルの z 値が保管されている値未満の場合に、深度テストにパスします。 Equal: ピクセルの z 値が保管されている値と等しい場合に、深度テストにパスします。 Less Equal: ピクセルの z バッファ値が、保管されている値未満または等しい場合に、深度テストにパスします。テストされたピクセルはその他のピクセルの前でレンダリングされます。 Greater: ピクセルの z 値が保管されている値を超える場合に、深度テストにパスします。 Not Equal: ピクセルの z 値が保管されている値と等しくない場合に、深度テストにパスします。 Greater Equal: ピクセルの z バッファ値が、保管されている値を超えるまたは等しい場合に、深度テストにパスします。 Always: 常に深度テストにパスし、保管されている値との比較はありません。この設定は Override Depth が有効なときのみに表示されます。 |
Write Depth | Write Depth を有効にすると、Unity はマテリアルを使うゲームオブジェクトに深度値を書きます。 Unity に各ゲームオブジェクトに対する深度値を書いてほしくない場合は、無効にします。 |
Sorting | レンダリング前に Unity がシーンでゲームオブジェクトを並び替える方法を選択します。 詳細は ソート基準 を参照してください。 |
ForwardOnly サポート
Unity は Pass Name を使って、HDRP マテリアルにレンダリングするシェーダーのパスを選択します。オブジェクトカラーをレンダリングするには、Forward またはForwardOnly を選択します。オブジェクトの深度のみをレンダリングしたい場合は、DepthForwardOnly Pass Name を使ってください。
新しい Draw Renderers Custom Pass を作成中に次の警告が表示される場合は、HDRP Asset 設定に原因がある可能性があります。
この問題を修正するには、Assets フォルダー (HDRP テンプレートを利用している場合は、Assets > Settings) の HDRP Asset に行き、Lit Shader Mode を Both に変更します。詳細はシーンでのレンダラーの深度変更 を参照してください。
マテリアルと投入ポイントの互換性
Injection Point (投入ポイント) は、Unity がいつレンダーループで Custom Pass Volume を実行するかを決定します。
ただし、Draw Renderers Custom Pass のすべての投入ポイントにサポートされていないマテリアルもあります。次の表では、各投入ポイントが Draw Renderers Custom Pass をサポートするマテリアルをリスト化しています。
Injection Point | サポートされるマテリアルタイプ |
---|---|
Before Rendering | Camera カラーに書き込みなしの Unlit フォワード |
After Opaque Depth And Normal | Unlit フォワード |
Before PreRefraction | Unlit および Lit フォワードのみ |
Before Transparent | 屈折のある Unlit および Lit フォワードのみ |
Before Post Process | 屈折のある Unlit および Lit フォワードのみ |
After Post Process | 屈折のある Unlit および Lit フォワードのみ |
Unity が現在の投入ポイントにサポートされていないマテリアルをレンダリングする際、想定外の結果が生じます。例えば、After Opaque Depth And Normal の Lit シェーダーでゲームオブジェクトをレンダリングすると、投入ポイントは予想外の結果を生みます。
Custom Renderers Pass シェーダー
Custom Renderers Pass シェーダーを使って、上級者向けの Custom Pass エフェクトを作成することができます。このシェーダーを作成するには、Assets > Create > Shader > HDRP > Custom Renderers Pass に移動します。これにより、New Renderers CustomPass という名前の Unlit HDRP シェーダーが作成されます。この Unity シェーダーは ShaderLab パスが1つあります。
Custom Renderers Pass シェーダーを使った上級者向けエフェクトの作成
HDRP には、レンダーパイプラインがシーンでマテリアルをレンダリングするために使うデータを保管する、特定のシェーダー構造が含まれます。これらの構造は、フラグメントシェーダーコードのセクションで説明されています。
フラグメントシェーダーコード
Custom Renderers Pass シェーダーでフラグメントシェーダーコードを書くには、GetSurfaceAndBuiltinData
メソッドを使います。
このメソッドに使える入力は以下の通りです。
- フラグメントシェーダーに渡されるすべてのジオメトリ入力を含む
FragInputs
構造です。この構造のプロパティーに関する情報は、FragInput を参照してください。 - 現在のピクセルビュー方向を含む
float3
です。 - シェーダーに必要となる可能性がある位置ベースのユーティリティプロパティを含む
PositionInputs
構造です。この構造のプロパティーに関する情報は、PositionInputs を参照してください。
GetSurfaceAndBuiltinData
メソッドは出力結果に return
を使いません。その代わりに、out モディファイアを使う2つのパラメーターを持っています。これは、シェーダーのサーフェスタイプに応じて、異なる出力をサポートするためです。出力は以下の通りです。
- 最終カラーを含む、
SurfaceData
構造です。この構造のプロパティーに関する情報は、SurfaceData を参照してください。 - HDRPが特定のエフェクトを計算するために使う追加情報を含む、
BuiltinData
構造です。この構造のプロパティーに関する情報は、BuiltinData を参照してください。
次の例では、GetSurfaceAndBuiltinData
メソッドを用いてフラグメントシェーダーコードを書く方法を実演します。この例では、_ColorMap
テクスチャのカラーをサンプリングして、アルファチャンネルを使ってアルファテストを実行し、サーフェスにカラーテクスチャを出力します。
// このメソッドを使って Custom Pass の ゲームオブジェクトをレンダリングするコードを入力する
void GetSurfaceAndBuiltinData(FragInputs fragInputs, float3 viewDirection, inout PositionInputs posInput, out SurfaceData surfaceData, out BuiltinData builtinData)
{
float2 colorMapUv = TRANSFORM_TEX(fragInputs.texCoord0.xy, _ColorMap);
float4 result = SAMPLE_TEXTURE2D(_ColorMap, s_trilinear_clamp_sampler, colorMapUv) * _Color;
float opacity = result.a;
float3 color = result.rgb;
# ifdef _ALPHATEST_ON
DoAlphaTest(opacity, _AlphaCutoff);
# endif
// 出力構造にデータを書き戻す
ZERO_INITIALIZE(BuiltinData, builtinData); // ライティングがないため、InitBuiltinData に呼び出しなし
builtinData.opacity = opacity;
builtinData.emissiveColor = float3(0, 0, 0);
surfaceData.color = color;
}
FragInputs
FragInputs
はフラグメントステージに渡されるすべてのジオメトリ入力を保管する構造体です。
struct FragInputs
{
float4 positionSS; // 深度オフセットが使われる場合、positionRWS.w は深度オフセットに等しい
float3 positionRWS; // 相対カメラスペース位置
float4 texCoord0; // UV0
float4 texCoord1; // UV1
float4 texCoord2; // UV2
float4 texCoord3; // UV3
float4 color; // 頂点カラー
float3x3 tangentToWorld;
bool isFrontFace;
};
PositionInputs
PositionInputs
はシェーダーで使う可能性がある、別のプロパティーセットを提供します。位置にかかわるプロパティーにアクセスするための、ユーティリティ構造と考えるとよいでしょう。深度は現在のカメラ深度バッファから用いられ、tileCoord
は利用できません (コンピュートシェーダーのみで利用されます)。
struct PositionInputs
{
float3 positionWS; // ワールド空間の位置 (カメラ相対の場合もあり)
float2 positionNDC; // ビューポイント付きの正規化されたスクリーン座標 : [0, 1) (ハーフピクセルオフセット)
uint2 positionSS; // スクリーンスペースピクセル座標 : [0, NumPixels)
uint2 tileCoord; // スクリーンタイル座標 : [0, NumTiles)
float deviceDepth; // 深度バッファからの深度 : [0, 1] (通常逆)
float linearDepth; // ペース Z 座標表示 : [近く、遠く]
};
SurfaceData
SurfaceData
構造では、オブジェクトの表面のカラーを設定できます。それぞれのマテリアルタイプの表現は異なります。Unlit シェーダーには、Unlit オブジェクトのカラーを表現する1つのフィールドのみが含まれます。
struct SurfaceData
{
float3 color;
};
BuiltinData
BuiltinData
構造には、HDRP に渡す追加情報が含まれます。
struct BuiltinData
{
real opacity; // オブジェクトの透明度
real alphaClipTreshold; // アルファクリッピングのしきい値
real3 bakeDiffuseLighting;
real3 backBakeDiffuseLighting;
real shadowMask0;
real shadowMask1;
real shadowMask2;
real shadowMask3;
real3 emissiveColor; // エミッシブカラー
real2 motionVector; // 現在はサポートされていません
real2 distortion; // 歪みベクトル
real distortionBlur; // 歪みブラーレベル [0, 1]
uint renderingLayers;
float depthOffset; // 深度オフセット
real4 vtPackedFeedback;
};
頂点シェーダーコード
Custom Renderers Pass シェーダーで頂点シェーダーコードを書くには、ApplyMeshModification メソッドを使います。デフォルトでは、シェーダーがこのメソッドをコメントアウトしているため、使う際にはコメントの斜め二重線 (//) を削除してください。頂点デフォーメーションや頂点アニメーションを Unity シェーダーに追加する際に、この方法を使えます。
このメソッドに使える入力は以下の通りです。
- 現在の頂点およびプロパティーを含む AttributeMesh 構造です。この構造のプロパティーに関する情報、およびどれがマップを定義するかについては、AttributeMesh を参照してください。
- 現在の
timeParameters
を含む float3 です。この float では、x 値は秒で時間を表し、y 値は sin(x) を、z 値は cos(x) を示します。
このメソッドは、修正された頂点を表す AttributeMesh
を返します。通常のワークフローでは、入力 AttributeMesh
を修正して返します。
このメソッドでは、変更はオブジェクト空間で発生しますので注意してください。ワールド空間で変更したい場合は次のようにします。
- オブジェクト空間のデータをワールド空間に変換します。
TransformObjectToWorld
メソッドで位置データを、TransformObjectToWorldDir
で法線データを変換します。 - 変更を適用します。
- ワールド空間のデータを再びオブジェクト空間に変換します。
TransformWorldToObject
メソッドで位置データを、TransformWorldToObjectDir
で法線データを変換します。
このメソッドで頂点シェーダーコードを書く方法例については、次のコードサンプルを参照してください。この例では、頂点データを変更してメッシュをやや拡大させ、Z ファィティングを防いでいます。
# define HAVE_MESH_MODIFICATION
AttributesMesh ApplyMeshModification(AttributesMesh input, float3 timeParameters)
{
input.positionOS += input.normalOS * 0.0001; // メッシュをやや拡大させ、Z ファィティングを防ぐ。
return input;
}
AtrributeMesh
AttributesMesh
構造の定義は次の通りです。
struct AttributesMesh
{
float3 positionOS : POSITION;
float3 normalOS : NORMAL;
float4 tangentOS : TANGENT; // w にサインを保管する
float2 uv0 : TEXCOORD0;
float2 uv1 : TEXCOORD1;
float2 uv2 : TEXCOORD2;
float2 uv3 : TEXCOORD3;
float4 color : COLOR;
};
フラグメントシェーダーでの UV サンプリング
Unity は次の定義を使い、データを頂点およびフラグメントシェーダーに送信します。
ATTRIBUTES_NEED_TEXCOORD0
VARYINGS_NEED_TEXCOORD0
ATTRIBUTES_NEED
および VARYINGS_NEED
システムを使って、Unity がどのデータを頂点およびフラグメントシェーダーに送信するかを決定します。ATTRIBUTES_NEED
は頂点データを制御し、VARYINGS_NEED
はフラグメントデータを制御します。このデータは次の定義リストを使って制御することができます。
# define ATTRIBUTES_NEED_NORMAL
# define ATTRIBUTES_NEED_TANGENT
# define ATTRIBUTES_NEED_TEXCOORD0
# define ATTRIBUTES_NEED_TEXCOORD1
# define ATTRIBUTES_NEED_TEXCOORD2
# define ATTRIBUTES_NEED_TEXCOORD3
# define ATTRIBUTES_NEED_COLOR
# define VARYINGS_NEED_POSITION_WS
# define VARYINGS_NEED_TANGENT_TO_WORLD
# define VARYINGS_NEED_TEXCOORD0
# define VARYINGS_NEED_TEXCOORD1
# define VARYINGS_NEED_TEXCOORD2
# define VARYINGS_NEED_TEXCOORD3
# define VARYINGS_NEED_COLOR
# define VARYINGS_NEED_CULLFACE
ATTRIBUTES_NEED_TEXCOORD0
および ATTRIBUTES_NEED_NORMAL
を使い、デフォルトで UV0と法線にアクセスできます。
シーンでのレンダラーの深度変更
レンダラーコンポーネントいずれかの深度ステートは、Custom Pass でオーバーライドできます。こうすることで、Custom Pass Volume で割り当てられた深度レンダーステートでレンダリングされたシーンのゲームオブジェクトの深度ステートを置き換えます。Custom Pass で、シーン中のゲームオブジェクトのいくつかを非表示にする際に、これを使うことも可能です。
またこのメソッドを使い、カメラのカリングマスクにない Custom Pass のゲームオブジェクトをレンダリングすることもできます。Unity は深度テストの Equal で、Camera Culling Mask にない不透明な ゲームオブジェクトをレンダリングします。ゲームオブジェクトが深度バッファにある倍は、レンダラーの深度ステートのみを変更できます。これらの不透明なゲームオブジェクトを深度バッファに含めるには、Custom Pass Volume コンポーネントへ行き、Depth Test プロパティーを Less Equal に設定してください。
Unity は Forward レンダリングパス を使って、Custom Pass ですべてのオブジェクトをレンダリングします。これはシーンが Deferred Only でレンダリングするように設定されている場合に、問題が生じます。 HDRP Asset で Lit Shader Mode を Both に変更し、プロジェクトをビルドする際に問題がないようにしてください。
Custom Buffer Format の使用
カスタムバッファを使って、パスの結果を保管し、後のレンダリングプロセスで実行したり、2つの Custom Pass の間で実行することが可能です。これらのカスタムバッファは、いずれの Custom Pass シェーダーでもサンプリングできます。
Unity は Draw Renderer Custom Pass 用に、ターゲットバッファをデフォルトでカメラバッファに設定しますが、その代わりにカスタムバッファを選ぶこともできます。Custom Buffer Format を使うためには、シーンに HDRP Asset が必要です。HDRP テンプレートシーンを作成済みの場合は、Assets > Settings に **HRenderPipelineAsset という名前の HDRP アセットが表示されます。そうでない場合は、次の HDRP Asset の指示に従い、シーンに新しい HDRP Asset を作成してください。
HDRP Asset で Custom Pass コンポーネントの Buffer Format を変更するには、Rendering > Custom Pass > Custom Buffer Format に行きます。
また、HDRP アセットで Custom Pass を無効にすることもできます。この場合は Custom Pass プロパティーを無効にします。これでカスタムバッファの割り当てが自動的に無効化されます。さらに、フレーム設定で Custom Pass をレンダリングするかを選択することも可能です。この場合バッファ割り当てには影響しません。