🌈

そろそろShaderをやるパート87 -URP編- Render Featureで遮蔽時にエフェクトをかけるサンプルを見る②

2023/05/12に公開

そろそろShaderをやります

そろそろShaderをやります。そろそろShaderをやりたいからです。
パート100までダラダラ頑張ります。10年かかってもいいのでやります。
100記事分くらい学べば私レベルの初心者でもまあまあ理解できるかなと思っています。

という感じでやってます。

※初心者がメモレベルで記録するので
 技術記事としてはお力になれないかもしれません。

下準備

下記参考
そろそろShaderをやるパート1 Unite 2017の動画を見る(基礎知識~フラグメントシェーダーで色を変える)

URP対応のためにUnityHubからプロジェクトテンプレート選択画面でURPを選択しました。

PackageManager経由でURPのサンプルシーンを取得可能です。

バージョン

Unity 2021.2.12f1
Universal RP 12.1.4

デモ

前回のサンプルのままだと、PlayerのLayerを持つオブジェクトが重なった場合の描画処理が以下のようになります。

【参考リンク】:そろそろShaderをやるパート86 -URP編- Render Featureで遮蔽時にエフェクトをかけるサンプルを見る①

それを解消したものが以下のデモです。

やり方

ステップとしては以下の三段階です。

1.任意のLayerを描画対象から外す
2.オブジェクトに遮蔽された箇所のレンダリングを行う
3.通常通りオブジェクトのレンダリングを行う

任意のLayerを描画対象から外す

今回の例ではPlayerのLayerを描画対象から外します。
PlayerのLayerはオレンジ色のCubeに割り当てています。

実際の設定画面は以下です。RendererデータのFilteringから設定可能です。

この段階でシーンを見るとPlayerのLayerが割り当てられたオブジェクトが描画されなくなったことがわかります。

オブジェクトに遮蔽された箇所のレンダリングを行う

次に遮蔽された箇所の設定を行います。Renderer FeatureからRender Objectsを利用します。

以下のように設定します。マテリアルは遮蔽時に適用したいマテリアルです。
この時、深度値は書き込まないようにしておきます。理由は後述します。

正しく設定できている場合、以下画像の状態となります。遮蔽箇所のみ描画され、設定したマテリアルが適用されています。

通常通りオブジェクトのレンダリングを行う

最後に、通常通りのレンダリングを行います。

注意点として、Render Objectsの順番を遮蔽物の描画 -> 通常の描画としてあげることです。

この順番を逆にすると、遮蔽表現のレンダリングが最後に行われるため、PlayerのLayerを設定したオブジェクト同士が重なった個所の描画まで遮蔽表現となります。(これが正しい表現の場合は問題ありません)

ここまでの設定が正しければ以下のような状態となります。

前述の深度値を書き込まなかった理由ですが、もし書き込んだ場合、以下のようになります。
深度値を書き込んだことで遮蔽物の描画通常の描画のうち、後者の通常の描画処理のRenderObjectでZTestに合格してしまい、前者の処理が上塗りされてしまうためです。

参考リンク

Example: How to create a custom rendering effect using the Render Objects Renderer Feature

Discussion