🌈

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

2023/04/24に公開

そろそろShaderをやります

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

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

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

下準備

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

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

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

バージョン

Unity 2021.2.12f1
Universal RP 12.1.4

デモ

サンプルプロジェクトそのままですが、遮蔽物に隠れた際にだけ表示が切り替わるデモです。

仕組み

まずUniversal Renderer Pipeline Assets(以後Pipelineアセット)が必要です。サンプルには既に用意されているのでそれを見ていきます。

Pipelineアセットではプロジェクトのグラフィックにまつわるいろいろを設定可能です。

その中でもさらに細かく設定が可能なRenderingという項目があります。

このRenderingという項目を設定するにはUniversal Renderer Data(以後Rendererデータ)が必要です。文字通り、Renderingにおける細かい設定が可能です。

そして、このRendererデータにはRender Featureを付与することができます。
先ほどのRendererデータはRender Objectsという機能が付与されています。

Render Objectsを利用することで、任意のタイミングに処理を追加したり、設定を追加したりすることができます。

【参考リンク】:URP Renderer Feature

それぞれの関係性を超簡単に図解したものが以下です。
Unityプロジェクト単位でPipelineアセットを設定し、そのPipelineアセットに対してRendererデータを設定し、さらにRendererデータに対してRender Featureを付与することでレンダリング処理を拡張できるということになります。

かなりの前置きになりましたが、実際に今回のサンプルで遮蔽物に隠れたときにだけ特定の描画を行う設定については以下画像の箇所のみで完結します。


Opaqueのレンダーキューを持つオブジェクトについてレンダリング終わりのタイミングで、PlayerというLayerのオブジェクトに対してOverriddesの箇所の処理が適用されます。

Overriddesについては以下のような設定となっています。
深度値の書き込みとDepthTestをGreaterとしている設定により、"既に何かしらの不透明オブジェクトが描画済みのピクセル"に対して、設定したMaterialが適用されます。

【参考リンク】:そろそろShaderをやるパート68 ZWrite、ZTest、RenderQueueを理解する

これにより、遮蔽物が存在している場合においてのみ、任意のマテリアルを適用可能になっています。

Discussion