【Unity】URPでのポストプロセス入門

概要
この記事では、URPでScriptable Render
Featureを実装して、ポストプロセスを実装する方法を解説します。
初めのポストプロセスを追加するのは大変ですが、2個目以降は楽になります。
環境
- Unity: 2021.3.0f1
- URP: 12.1.6
URP12.1.7だとうまく動かなかったので、おかしいなと思ったらバージョンを下げてみてください。
Scriptable Render Featureとは
レンダリングパイプラインの任意のタイミングでカスタム描画パスを追加できる機能です。
URPとHDRPでのみ使用できます。
カスタム描画パスを追加した例

スクリプタブルレンダーパイプライン設定ファイルの作成
以下の手順に沿って設定ファイルを作成しましょう。
- プロジェクトビューで右クリックを押す
- Rendering > URP Asset with Universal Renderer をクリック
- 適当な名前をつける(ここでは Post Effectとしました)
そうすると以下の2つのファイルが作成されます。
PostEffect: レンダーパイプライン設定ファイル
PostEffect Renderer: レンダラーデータ

レンダーパイプラインの設定
Edit > Project Settings > Quality > RenderPipeline Asset に
さきほど作った PostEffect ファイルを設定します。

Monochrome
Volumeを実装する モノクロを調整するためのVolume Componentを作成します。
Weightパラメータを操作すると、どのぐらいモノクロ化するか調整できます。
MonochromeVolume.cs
https://gist.github.com/went5/6a46b33b20b41a4e6cd1cde58a8b17c2?file=GrayscaleVolume.cs
PostEffectPassを実装する
カスタム描画パスを作成するために、ScriptableRenderPassを継承して実装しています。
グルーコードのようなものなのでここでは解説しません。
PostEffectPass.cs
https://gist.github.com/went5/6a46b33b20b41a4e6cd1cde58a8b17c2?file=PostEffectPass.cs
PostEffectFeatureを実装する
レンダラーデータに追加するために、ScriptableRendererFeatureを継承して実装しています。
PostEffectFeature.cs
https://gist.github.com/went5/6a46b33b20b41a4e6cd1cde58a8b17c2?file=PostEffectFeature.cs
Create メソッドでは、PostEffectPassのインスタンスを生成しています。
renderPassEvent に描画パスのタイミングを指定することで、
どの順番で実行してほしいか設定することができます。
renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing
AddRenderPasses メソッドでは、
VolumeComponentで設定したWeight値をマテリアルにセットし、描画パスを追加しています。
_monoPass.material.SetFloat("_Weight", mono.Weight.value);
renderer.EnqueuePass(_monoPass);
モノクロシェーダーを実装する
シェーダーグラフを使って、テクスチャをモノクロ化するシェーダーを作ります。
Grayscale.shadergraphの全体図

以下のURL先を名前をつけて保存してください (Grayscale.shadergraph)
https://gist.githubusercontent.com/went5/6a46b33b20b41a4e6cd1cde58a8b17c2/raw/1915393ed872882642cacd2a1c9e6f2c3a766d7d/Grayscale.shadergraph
Texture2D型の変数の名前をMainTexとすることで、カメラのカラーバッファからテクスチャを受け取ることができます。
このテクスチャから、輝度を抽出してWeight値で補間をかけたのが上記のシェーダーグラフとなります。

Renderer Featureを追加する
PostEffect Rendererに Renderer Featureを追加します。

Mono Shaderには、さきほど作ったShaderGraphを入れます。

シーンにVolumeを追加
シーンにポストプロセス効果を与えるために、VolumeComponentを持つオブジェクトを追加します。
さらにヒエラルキーで右クリックして、Volume > Globalを選択します。
そうすると、Volume Component内にAddOverrideというボタンがあるため、
クリックしてGrayscaleVolumeを追加します。

Weight値を0以上にすると、ポストプロセスが効くようになります。
参考
Table of contents