Version: Unity 6.0 (6000.0)
言語 : 日本語
レンダラー機能を URP レンダラーに追加する
URP の Render Objects Renderer Feature リファレンス

URP で Render Objects Renderer Feature を使用してカスタムレンダリングエフェクトを作成する例

URP は DrawOpaqueObjects パスと DrawTransparentObjects パスにオブジェクトを描画します。フレームレンダリングの異なるポイントでオブジェクトを描画する、またはレンダリングデータ (深度やステンシルなど) を解釈して別の方法で書き込むことが必要な場合があります。Render Objects Renderer Feature を使用すると、特定のオーバーライドにより、特定のレイヤーで特定の時間にオブジェクトを描画できるため、このようなカスタマイズが可能です。

このページの例は、Render Objects Renderer Feature を使用してカスタムレンダリングエフェクトを作成する方法を示しています。

例の概要

このページの例は、以下のエフェクトを実装する方法を示しています。

  • シーン内にキャラクターが 1 人います。

    Character
    Character
  • キャラクターがゲームオブジェクトの背後に移動すると、キャラクターのシルエットが別のマテリアルで描画されます。

    キャラクターがゲームオブジェクトの背後に移動する
    キャラクターがゲームオブジェクトの背後に移動する

必要条件

この例の前提条件は以下のとおりです。

  • Unity プロジェクトに URP パッケージがインストールされている。

  • Scriptable Render Pipeline Settings プロパティが URP アセットを参照している (Project Settings > Graphics > Scriptable Render Pipeline Settings)。

サンプルのシーンとゲームオブジェクトの作成

この例のステップを実行するために、以下のゲームオブジェクトが含まれる新しいシーンを作成します。

  1. キューブを作成します。キューブが壁のような見た目になるように Scale の値を設定します。

    壁を表すキューブ
    壁を表すキューブ
  2. マテリアルを作成して、Universal Render Pipeline/Lit シェーダーに割り当てます。通常色を選択します (赤など)。このマテリアルに Character という名前を付けます。

  3. この例のキャラクターは 3 つのカプセルで構成されています。この例のキャラクターは 3 つのカプセルで構成されています。中央の大きなカプセルは体を表し、2 つの小さなカプセルは手を表しています。

    3 つのカプセルで構成されたキャラクター
    3 つのカプセルで構成されたキャラクター

    シーン内でキャラクターを操作しやすくするために、Character ゲームオブジェクトに 3 つのカプセルを子ゲームオブジェクトとして追加します。

    階層内の Character オブジェクト
    階層内の Character オブジェクト
  4. マテリアルを作成して、Universal Render Pipeline/Unlit シェーダーに割り当てます。キャラクターがゲームオブジェクトの背後にいるときの通常色を選択します (青など)。このマテリアルに CharacterBehindObjects という名前を付けます。

これで、この例のステップの実行に必要な設定が完了しました。

実装例

このセクションは、サンプルのシーンとゲームオブジェクト セクションの説明のとおりにシーンが作成されていることを前提としています。

この実装例では、2 つの Render Objects Renderer Feature を使用します。1 つは他のゲームオブジェクトの背後にあるキャラクターの部分を描画し、もう 1 つは他のゲームオブジェクトの前にあるキャラクターの部分を描画するものです。

ゲームオブジェクトの背後にいるキャラクターを描画する Renderer Feature の作成

以下のステップに従って、ゲームオブジェクトの背後にキャラクターを描画する Renderer Feature を作成します。

  1. URP レンダラーを選択します。

    URP レンダラーを選択する
    URP レンダラーを選択する
  2. Inspector で、Add Renderer Feature をクリックし、Render Objects を選択します。

    Render Objects Renderer Feature を追加する
    Render Objects Renderer Feature を追加する

    Name フィールドを選択し、DrawCharacterBehind など、新しい Renderer Feature の名前を入力します。

  3. この例では、レイヤーを使用してレンダリングするゲームオブジェクトをフィルターします。新しいレイヤーを作成し、Character という名前を付けます。

    Character という名前の新しいレイヤーを作成する
    Character という名前の新しいレイヤーを作成する
  4. Character ゲームオブジェクトを選択し、Character レイヤーに割り当てます。それには、Layer ドロップダウンを開き、Character を選択します。Character ゲームオブジェクトを Character レイヤーに割り当てる

  5. DrawCharacterBehind Renderer Feature の Filters > Layer MaskCharacter を選択します。この設定により、この Renderer Feature はゲームオブジェクトを Character レイヤーにのみレンダリングするようになります。

  6. Overrides > MaterialCharacterBehindObjects マテリアルを選択します。

    Renderer Feature は、ゲームオブジェクトのマテリアルを、選択したマテリアルでオーバーライドします。

    Layer Mask、マテリアルのオーバーライド
    Layer Mask、マテリアルのオーバーライド
  7. ここで目指している Renderer Feature の動作は、キャラクターが他のゲームオブジェクトの背後にいるときにのみ CharacterBehindObjects マテリアルでキャラクターをレンダリングすることです。

    これを実現するには、Depth チェックボックスを選択し、Depth Test プロパティを Greater に設定します。

    Depth Test を Greater に設定する
    Depth Test を Greater に設定する

これらの設定により、キャラクターは他のゲームオブジェクトの背後にいるときにのみ CharacterBehindObjects マテリアルでレンダリングされます。しかし、キャラクターの部分がキャラクター自身を覆い隠してしまうため、キャラクターの部分も CharacterBehindObjects マテリアルでレンダリングされます。

キャラクターの部分が 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 は、その部分のマテリアルをオーバーライドします。

    セルフシースルーエフェクト
    セルフシースルーエフェクト

以下のステップでは、このような動作を回避し、キャラクターのすべてのパーツを適切なマテリアルで描画する方法を説明します。

  1. URP アセットの Filtering > Opaque Layer Mask で、Character レイヤーの隣に表示されているチェックマークをオフにします。

    Character レイヤーの隣に表示されているチェックマークをオフにする
    Character レイヤーの隣に表示されているチェックマークをオフにする

    そうすると、キャラクターがゲームオブジェクトの背後にいない場合に、キャラクターがレンダリングされなくなります。

    キャラクターは、オブジェクトの背後にいないときにレンダリングされない
    キャラクターは、オブジェクトの背後にいないときにレンダリングされない
  2. 新しい Render Objects Renderer Feature を追加し、Character という名前を付けます。

  3. Character Renderer Feature の Filters > Layer MaskCharacter レイヤーを選択します。

    Layer Mask フィルターを Character レイヤーに設定する
    Layer Mask フィルターを Character レイヤーに設定する

    これで、このキャラクターはゲームオブジェクトの背後にいるときにも Character マテリアルでレンダリングされるようになります。

    このようになるのは、DrawCharacterBehind Renderer Feature が深度バッファに値を書き込むからです。Unity が Character Renderer Feature を実行すると、キャラクターのピクセルは、以前に描画したピクセルの前にあるように見えます。Unity はそれらのピクセルの上に描画します。

  4. DrawCharacterBehind Renderer Feature の Overrides > Depth で、Write Depth チェックボックスをオフにします。この設定により、DrawCharacterBehind Renderer Feature は深度バッファに変更を加えず、Character Renderer Feature はキャラクターがゲームオブジェクトの背後にいるときにキャラクターを描画しなくなります。

    Write Depth をオフにする
    Write Depth をオフにする

これでこの例は完成です。キャラクターがゲームオブジェクトの背後に移動すると、キャラクターのシルエットが CharacterBehindObjects マテリアルで描画されます。

キャラクターがオブジェクトの背後に移動する
キャラクターがオブジェクトの背後に移動する

Character Renderer Feature を追加すると、ゲームオブジェクトは以下のようにレンダリングされます。

  1. URP レンダラーは、BeforeRenderingOpaques イベントで Character ゲームオブジェクトをレンダリングしません。これは、Character レイヤーが Opaque Layer Mask リストから除外されているためです。

  2. DrawCharacterBehind Renderer Feature が、他のゲームオブジェクトの背後にあるキャラクターの部分を描画します。これは AfterRenderingOpaques イベントで行われます。

  3. Character Renderer Feature が、他のゲームオブジェクトの前にあるキャラクターの部分を描画します。これは、DrawCharacterBehind Renderer Feature の実行後に、AfterRenderingOpaques イベントで行われます。

レンダラー機能を URP レンダラーに追加する
URP の Render Objects Renderer Feature リファレンス