docs.unity.cn

Universal RP 14.0.2

    目次を表示する/隠す

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

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

    例の概要

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

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

      キャラクター

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

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

    前提条件

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

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

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

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

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

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

      壁を表すキューブ

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

    3. 基本的なキャラクターを作成し、それに Character マテリアルを割り当てます。この例のキャラクターは 3 つのカプセルで構成されています。中央の大きなカプセルは体を表し、2 つの小さなカプセルは手を表しています。

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

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

      Hierarchy 内の Character オブジェクト

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

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

    実装例

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

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

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

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

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

      URP レンダラーの選択

    2. Inspector で、Add Renderer Feature をクリックし、Render Objects を選択します。

      Render Objects Renderer Feature の追加

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

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

      Character という名前の新しいレイヤーの作成

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

    5. Overrides > Material で、CharacterBehindObjects マテリアルを選択します。

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

      Layer Mask、マテリアルのオーバーライド

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

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

      Depth Test を Greater に設定

    これらの設定により、キャラクターが他のゲームオブジェクトの背後にいるときのみ、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` レイヤーの横にあるチェックマークをオフにする

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

      キャラクターがオブジェクトの背後にいない場合に、キャラクターがレンダリングされない

    2. 新しい Render Objects Renderer Feature を追加し、Character という名前を付けます。

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

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

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

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

      Write Depth をオフにする

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

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

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

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

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

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

    Render Objects Renderer Feature の他の使用例については、Universal Rendering Examples プロジェクトの Object Occlusion シーンを参照してください。

    概要
    • 例の概要
    • 前提条件
    • サンプルのシーンとゲームオブジェクトの作成
    • 実装例
      • ゲームオブジェクトの背後にいるキャラクターを描画する Renderer Feature の作成
      • セルフシースルーエフェクトを回避するための追加の Renderer Feature の作成
    トップに戻る
    Copyright © 2023 Unity Technologies — 商標と利用規約
    • 法律関連
    • プライバシーポリシー
    • クッキー
    • 私の個人情報を販売または共有しない
    • Your Privacy Choices (Cookie Settings)