例: 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
という名前を付けます。基本的なキャラクターを作成し、それに Character マテリアルを割り当てます。この例のキャラクターは 3 つのカプセルで構成されています。中央の大きなカプセルは体を表し、2 つの小さなカプセルは手を表しています。
シーン内でキャラクターを操作しやすくするために、Character ゲームオブジェクトに 3 つのカプセルを子ゲームオブジェクトとして追加します。
マテリアルを作成し、
Universal Render Pipeline/Unlit
シェーダーを割り当てます。キャラクターがゲームオブジェクトの背後にいるときの通常色を選択します (青など)。マテリアルにCharacterBehindObjects
という名前を付けます。
これで、この例のステップの実行に必要な設定が完了しました。
実装例
このセクションは、サンプルのシーンとゲームオブジェクト の説明のとおりにシーンが作成されていることを前提としています。
この実装例では、2 つの Render Objects Renderer Feature を使用します。1 つは他のゲームオブジェクトの背後にあるキャラクターの部分を描画し、もう 1 つは他のゲームオブジェクトの前にあるキャラクターの部分を描画するものです。
ゲームオブジェクトの背後にいるキャラクターを描画する Renderer Feature の作成
以下のステップに従って、ゲームオブジェクトの背後にキャラクターを描画する Renderer Feature を作成します。
URP レンダラーを選択します。
Inspector で、Add Renderer Feature をクリックし、Render Objects を選択します。
Name フィールドを選択し、DrawCharacterBehind など、新しい Renderer Feature の名前を入力します。
この例では、レイヤーを使用してレンダリングするゲームオブジェクトをフィルターします。新しいレイヤーを作成し、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
マテリアルでレンダリングされます。
セルフシースルーエフェクトを回避するための追加の Renderer Feature の作成
前のセクションの設定により、以下の理由でセルフシースルーエフェクトが発生します。
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
レイヤーの横にあるチェックマークをオフにします。そうすると、キャラクターがゲームオブジェクトの背後にいない場合に、キャラクターがレンダリングされなくなります。
新しい Render Objects Renderer Feature を追加し、
Character
という名前を付けます。Character
Renderer Feature の Filters > Layer Mask でCharacter
レイヤーを選択します。これで、キャラクターがゲームオブジェクトの背後にいるときにも、キャラクターが
Character
マテリアルでレンダリングされるようになりました。このような動作が起こるのは、
DrawCharacterBehind
Renderer Feature が深度バッファに値を書き込むためです。Unity がCharacter
Renderer Feature を実行すると、キャラクターのピクセルが、以前に描画したピクセルの前にあるように表示され、それらのピクセルの上に描画されます。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 が、他のゲームオブジェクトの前にあるキャラクターの部分を描画します。これは AfterRenderingOpaques イベントで、DrawCharacterBehind
Renderer Feature の実行後に行われます。
Render Objects Renderer Feature の他の使用例については、Universal Rendering Examples プロジェクトの Object Occlusion シーンを参照してください。