【Unity】ステンシルを利用して特定のもの以外暗くする

はじめに

今回はステンシルを使用して指定したもの以外暗くしていきます。

環境は Unity 2021.3.25f1です

Universal Render Pipeline を使用しています。

やり方

ステンシルの使い方こちらでも紹介しています

bravememo.hatenablog.com

レイヤー追加

まずカメラが映している場所全体を覆うような黒い板を作成し、カメラの子にします

マテリアルは透明度を変更できるならなんでもいいです。

次に黒い板と暗くしないオブジェクト用のレイヤーを作成、設定をします

描画の対応

Univesal Render Dataを開き、追加したレイヤーをLayerMaskから外します。

次にRenderObjectを2つ追加し、暗くしないオブジェクトの設定をします。

2つ追加するのは不透明と半透明を設定する必要があるからです

注意する点としてZFaillはKeepである必要があります。これをしないと下記のように本来映っていない部分にもステンシルの書き込みが行われて暗くなりません

次にRenderObjectを追加し黒い板オブジェクトの設定をします

NotEqualにすることでステンシルで2が書き込まれてるところ以外を描画するようになります

半透明対応

上記の状態でも指定したもの以外暗くするはできますが、半透明オブジェクトはメッシュの部分が暗くならないので下記のようなパーティクルのが矩形に表示されてしまいます

暗くしない半透明オブジェクトはAlpha Clippingを使用して透明部分を描画しないようにします

Alpha Clippingを使用したことでパーティクルが正常に表示されました

参考

shibuya24.info

完成

黒い板の透明度を変更すれば指定したもの以外を暗くすることができます