URP(2019.3)で自作のレンダーパスを追加する【unity】
個人的なメモをインターネットの片隅に添えさせていただきます。
万一、誤った点がありましたらご一報のほどよろしくお願いいたします。
サンプルリポジトリ:
引用リンクまとめ
ppsv2
URP
- Installing the Universal Render Pipeline into an existing Project
- How the Lightweight Render Pipeline is evolving
- 【CEDEC2018】Scriptable Render Pipelineを使ってみよう
ppsv3
- How the Universal Render Pipeline unlocks games for you - Unite Copenhagen 2019
- Volumes
- Class Volume
Scriptable(Custom)Renderer
- Universal Rendering Examples
- Configuring the Universal Render Pipeline
- Universal Render Pipeline Asset
- Namespace UnityEngine.Rendering.Universal
- Class ForwardRenderer
- Class ForwardRendererData
- Class ScriptableRendererData
- Class ScriptableRendererFeature
- Class ScriptableRenderPass
- Class ScriptableRenderer
参照
- Post Processing Stack v2にカスタムエフェクトを追加する方法
- 【Unity】UniversalRPでカスタムポストプロセスを作る【ZoomBlur】
- 【Unity2019 LWRP】ポストエフェクトを自作してゲームから利用する
- 【Universal Render Pipeline】ShaderGraphをポストエフェクトとして使ってみる
- Lightweight Render Pipeline(LWRP) のパイプラインを拡張する
- Unity の Universal Render Pipeline のレンダリング周りについて勉強してみた
本文のまえに
従来のビルトインレンダリングパイプラインではOnRenderImageなどcameraのコールバック系を利用することで自作のポスプロ処理ができました。
が、URPではこのやり方はサポートされません。*1
ので以前はppsv2にカスタムエフェクトを追加して自作のポスプロ処理をしたのです*2
が、2019.3のURPではppsはppsv3となり、若干仕様が変わったため従来通りのやり方ではうまくいきません。*3 *4
ので自作のレンダーパスを追加することで自作のポスプロ処理をやっていきます。
概要
レンダーパス追加において主に必要になるのは、
- Universal Render Pipeline Asset
- Scriptable(Custom)Renderer
- ScriptableRenderFeature
- ScriptableRenderPass
あたりです。
Universal Render Pipeline Asset
URPAssetはURPのgraphicの機能やqualityの設定をコントロールするもので、
これをgraphics settingsで割り当てると、ビルトインからURPに切り替わります。
また複数のassetを用意して、それらを切り替えることもできますが、URP / HDRP / SRP間の切り替えはできません。*5*6
Scriptable(Custom)Renderer
ScriptableRendererはcullingやlightingなど一連のレンダリング機能を実装したもので、これをURPAssetのRendererListに割り当てると、CameraコンポーネントからRendererを選択することができます。*7
RendererのリソースはScriptableRendererDataでselializedされます*8
また、Rendererは後述のRenderFeatureを追加することで拡張できます。
2019.3URPでは(singlepass)ForwardRendererと、2DRenderer(まだexperimental)が付属されており(今後defferdにも対応していくみたい)、これらにRenderFeatureを追加するなどしてカスタムしていきます。
ScriptableRenderFeature
RenderFeatureはRendererに後述のRenderPassを特定のrenderevent(AfterRenderingOpaquesなど)に注入するためのリソースとロジックを含むscriptable objectで、これをRendererのRenderFeaturesListに追加することでRendererをカスタムします。
URPはGUIでfeatureを作成する汎用的なRenderObjects featureを備えていて、またScriptableRenderFeatureを継承したスクリプトを作成することでさらに自由度の高いcustomfeatureを追加することができます。*9 *10
ScriptableRenderPass
Rendererを拡張するための個々のレンダリングパスを実装したもの。他のrendereventのレンダリングパスもScriptableRenderPassによって実装されています。ここでCommandBuffer組み立て処理をします。*11 *12
実装
unity: 2019.3.0f6
最初のテンプレはビルトインを選択して、あとからpackagemanagerでURPをインストールします。*13
まずURPAssetを作成します。
Create > Rendering > Universal Render Pipeline > Pipeline Asset
作成すると、URPAssetといっしょにRendererも生成され、URPAssetのRenderListに割り当てられていることがわかります。
Rendererをカスタムするため、RendererFeatureを作成します。
ScriptableRenderFeatureを継承したスクリプトをつくって、rgbを反転させるポスプロ処理をやっていきます。
RenderFeature*14
RenderPass*15
shader
すると、RenderFeatureListにつくったfeatureが追加できるようになるので、追加します。
最後に、Edit > Project Settings > Graphics のScriptableRenderPipelineAssetsにURPAssetsを割り当てます。
以上で、(ppsの描画後に)rgbを反転させるレンダーパスを追加できました。
renderfeatureにシリアライズ変数として実装したbool値を変更することで確認できます。
framedebugger
Tips
- create > Rendering > URP > Render feature でfeatrureのスクリプトテンプレがつくれる
- ppsv3の公式のカスタムエフェクトの実装はまだないけど、volumecomponentを継承したクラスとrenderfeatureで実装できる(rendereventがポスプロまわりに制限されないppsのカスタムエフェクト?)*16
わからない
renderobjectsでcommandbuffer.blitっぽい処理をしたい、けどできない。わからない...
これから
renderfeature複数割り当てたりrenderer切り替えたりして実際に画づくりやっていきです!
*1:【CEDEC2018】Scriptable Render Pipelineを使ってみよう
*3:How the Universal Render Pipeline unlocks games for you - Unite Copenhagen 2019
*5:Universal Render Pipeline Asset
*6:Configuring the Universal Render Pipeline
*7:How the Lightweight Render Pipeline is evolving
*9:How the Lightweight Render Pipeline is evolving
*10:Class ScriptableRendererFeature
*11:Class ScriptableRenderPass
*12:Lightweight Render Pipeline(LWRP) のパイプラインを拡張する
*13:もちろんテンプレからURPを選択しても問題ないのですが、URPAssetの切り替えが動作しなくなってしまった(rendererが反映されなかった....)ので、こうしています。自分だけでしょうか....
*14:Class ScriptableRendererFeature