URP は DrawOpaqueObjects パスと DrawTransparentObjects パスにオブジェクトを描画します。フレームレンダリングの異なるポイントでオブジェクトを描画する、またはレンダリングデータ (深度やステンシルなど) を解釈して別の方法で書き込むことが必要な場合があります。Render Objects Renderer Feature を使用すると、特定のオーバーライドにより、特定のレイヤーで特定の時間にオブジェクトを描画できるため、このようなカスタマイズが可能です。
このページの例は、Render Objects Renderer Feature を使用してカスタムレンダリングエフェクトを作成する方法を示しています。
このページの例は、以下のエフェクトを実装する方法を示しています。
シーン内にキャラクターが 1 人います。
キャラクターがゲームオブジェクトの背後に移動すると、キャラクターのシルエットが別のマテリアルで描画されます。
この例の前提条件は以下のとおりです。
Unity プロジェクトに URP パッケージがインストールされている。
Scriptable Render Pipeline Settings プロパティが URP アセットを参照している (Project Settings > Graphics > Scriptable Render Pipeline Settings)。
この例のステップを実行するために、以下のゲームオブジェクトが含まれる新しいシーンを作成します。
キューブを作成します。キューブが壁のような見た目になるように Scale の値を設定します。
マテリアルを作成して、Universal Render Pipeline/Lit シェーダーに割り当てます。通常色を選択します (赤など)。このマテリアルに Character という名前を付けます。
この例のキャラクターは 3 つのカプセルで構成されています。この例のキャラクターは 3 つのカプセルで構成されています。中央の大きなカプセルは体を表し、2 つの小さなカプセルは手を表しています。
シーン内でキャラクターを操作しやすくするために、Character ゲームオブジェクトに 3 つのカプセルを子ゲームオブジェクトとして追加します。
マテリアルを作成して、Universal Render Pipeline/Unlit シェーダーに割り当てます。キャラクターがゲームオブジェクトの背後にいるときの通常色を選択します (青など)。このマテリアルに CharacterBehindObjects という名前を付けます。
これで、この例のステップの実行に必要な設定が完了しました。
このセクションは、サンプルのシーンとゲームオブジェクト セクションの説明のとおりにシーンが作成されていることを前提としています。
この実装例では、2 つの Render Objects Renderer Feature を使用します。1 つは他のゲームオブジェクトの背後にあるキャラクターの部分を描画し、もう 1 つは他のゲームオブジェクトの前にあるキャラクターの部分を描画するものです。
以下のステップに従って、ゲームオブジェクトの背後にキャラクターを描画する Renderer Feature を作成します。
URP レンダラーを選択します。
Inspector で、Add Renderer Feature をクリックし、Render Objects を選択します。
Name フィールドを選択し、DrawCharacterBehind など、新しい Renderer Feature の名前を入力します。
この例では、レイヤーを使用してレンダリングするゲームオブジェクトをフィルターします。新しいレイヤーを作成し、Character という名前を付けます。
Character ゲームオブジェクトを選択し、Character レイヤーに割り当てます。それには、Layer ドロップダウンを開き、Character を選択します。
DrawCharacterBehind Renderer Feature の Filters > Layer Mask で Character を選択します。この設定により、この Renderer Feature はゲームオブジェクトを Character レイヤーにのみレンダリングするようになります。
Overrides > Material で CharacterBehindObjects マテリアルを選択します。
Renderer Feature は、ゲームオブジェクトのマテリアルを、選択したマテリアルでオーバーライドします。
ここで目指している Renderer Feature の動作は、キャラクターが他のゲームオブジェクトの背後にいるときにのみ CharacterBehindObjects マテリアルでキャラクターをレンダリングすることです。
これを実現するには、Depth チェックボックスを選択し、Depth Test プロパティを Greater に設定します。
これらの設定により、キャラクターは他のゲームオブジェクトの背後にいるときにのみ CharacterBehindObjects マテリアルでレンダリングされます。しかし、キャラクターの部分がキャラクター自身を覆い隠してしまうため、キャラクターの部分も CharacterBehindObjects マテリアルでレンダリングされます。
CharacterBehindObjects マテリアルでレンダリングされる前のセクションの設定により、以下の理由でセルフシースルーエフェクトが発生します。
Unity は URP レンダラーの不透明レンダーパスを実行するとき、キャラクターに属するすべてのゲームオブジェクトを Character マテリアルでレンダリングし、深度値を深度バッファに書き込みます。これは、Unity が DrawCharacterBehind Renderer Feature の実行を開始する前に行われます。デフォルトでは、新しい Render Objects Renderer Feature の Event プロパティに AfterRenderingOpaques という値が設定されているためです。
Event プロパティは、Unity が Render Objects Renderer Feature からレンダーパスを挿入するインジェクションポイントを定義するものです。URP レンダラーが Opaque Layer Mask にゲームオブジェクトを描画する際のイベントは BeforeRenderingOpaques イベントです。
Unity は DrawCharacterBehind Renderer Feature を実行するとき、Depth Test プロパティで指定された条件を使用して深度テストを実行します。以下のスクリーンショットでは、大きなカプセルが小さなカプセルの一部を覆い隠しており、小さなカプセルのその部分は深度テストに合格しています。Renderer Feature は、その部分のマテリアルをオーバーライドします。
以下のステップでは、このような動作を回避し、キャラクターのすべてのパーツを適切なマテリアルで描画する方法を説明します。
URP アセットの Filtering > Opaque Layer Mask で、Character レイヤーの隣に表示されているチェックマークをオフにします。
Character レイヤーの隣に表示されているチェックマークをオフにするそうすると、キャラクターがゲームオブジェクトの背後にいない場合に、キャラクターがレンダリングされなくなります。
新しい Render Objects Renderer Feature を追加し、Character という名前を付けます。
Character Renderer Feature の Filters > Layer Mask で Character レイヤーを選択します。
これで、このキャラクターはゲームオブジェクトの背後にいるときにも Character マテリアルでレンダリングされるようになります。
このようになるのは、DrawCharacterBehind Renderer Feature が深度バッファに値を書き込むからです。Unity が Character Renderer Feature を実行すると、キャラクターのピクセルは、以前に描画したピクセルの前にあるように見えます。Unity はそれらのピクセルの上に描画します。
DrawCharacterBehind Renderer Feature の Overrides > Depth で、Write Depth チェックボックスをオフにします。この設定により、DrawCharacterBehind Renderer Feature は深度バッファに変更を加えず、Character Renderer Feature はキャラクターがゲームオブジェクトの背後にいるときにキャラクターを描画しなくなります。
これでこの例は完成です。キャラクターがゲームオブジェクトの背後に移動すると、キャラクターのシルエットが CharacterBehindObjects マテリアルで描画されます。
Character Renderer Feature を追加すると、ゲームオブジェクトは以下のようにレンダリングされます。
URP レンダラーは、BeforeRenderingOpaques イベントで Character ゲームオブジェクトをレンダリングしません。これは、Character レイヤーが Opaque Layer Mask リストから除外されているためです。
DrawCharacterBehind Renderer Feature が、他のゲームオブジェクトの背後にあるキャラクターの部分を描画します。これは AfterRenderingOpaques イベントで行われます。
Character Renderer Feature が、他のゲームオブジェクトの前にあるキャラクターの部分を描画します。これは、DrawCharacterBehind Renderer Feature の実行後に、AfterRenderingOpaques イベントで行われます。