[unity6] URP のポストプロセス
BRP と URP ではずいぶん異なっているようなので、備忘録として初期設定方法を紹介します。
有料アセットである SC PostEffects Pack や Beautify3 についてもまとめてみました。
✅準備
Universal 3D でプロジェクトを新規作成します。
Global Volume というオブジェクトが最初から配置されていますが、これがポストプロセスを設定するオブジェクトになります。
適当な 3D オブジェクトがなかったので、2D で確認します。
用意した画像
❗注意点
- UI/Image の場合、Canvas は Main Camera をアタッチするようにしてください。
-
Main Camera の
Post Processing
に✅を入れておきます。
🎯プリインストールされたポストプロセス
BRP と違い、最初から用意されている Global Volume を設定するだけで、お手軽に映像に変化をつけることができます。
例えばこんな感じに設定すると、さっきの画像がこのように変化します。
新しい項目は Add Override で追加することができます。
🎯SC Post Effects Pack
非常に多くのエフェクトを持っていますが、処理負荷が高いものもあります。
(Unity6 には現在正式に対応していませんが、一応使うことはできました)
- (購入していなければ)SC Post Effects Pack を購入
-
Package Manager
からインストール
-
Enable
、Install files -> update files
、Unpack files
を選択 -
Global Volume > Add Override > SC Post Effects > Blurring > Blur
を選択
- 警告に従って
> Add
すると、Assets/Settings/PC_Renderer に設定されます。
- SC Post Effects Pack は正式に Render Graph に対応していないので、
Project Settings > Graphics > Render Graph > Compatibility Mode (Render Graph Disabled)
に✅をつけてください。
-
Amount
の値をあげると、ブラー効果が確認できます。
(モバイルなどで負荷が高い場合は Downscaling の値を上げましょう)
ブラー(ぼかし)
- 他にもいろいろあります。例えば Kuwahara を設定するとこんな手書き風に。
手書き風
🎯Beautify3
こちらも多数のエフェクトを持っています。Render Graph にも正式対応済。
- (購入していなければ)Beautify3 を購入
-
Package Manager
からインストール - インポート後、フォルダにある URP/Beautify_URP(.unitypackage) を実行し、更にインポート
Yes で OK
Global Volume > Add Override > Kronnect > Beautify
- まだ使えない状態。
Go to Universal Rendering Pipeline Asset
ボタンを押す
-
PC_Renderer の
Renderer Features
に Beautify を追加し、✅をつけます。
Mobile_Renderer など、設定ファイルがターゲットごとにある場合、全てに設定してください。 - Beautify は、その中にBeautify Shader Features Stripping という項目があります。使用しない場合、✅をつけてください(Renderer Features と設定値が逆になるので、注意)
-
Global Volume に戻り、Night Vision の
Enable
を✅します
先ほどの Beautify Shader Features Stripping を正しく設定していない場合、警告が出るので、(click to configure)
をクリック
-
Strip Night Vision
の✅を外します(✅のある項目=使用しない) -
Night Vision が反映された画面になっていることを確認します
ナイトビジョン
✅コードで Render Features を制御する
BRP と異なり、Renderer で使用のオンオフを定義するのがちょっと面倒ですが、これによってパフォーマンスの改善を制御できるようなので、慣れていきましょう。
下記は、「GlobalVolume にあるメンバーのみオンにする」コードです。
VolumeProfile を場面ごとに作り、切り替える想定。
エラーチェックや変数のキャッシュは捨て、とりあえず動くことを優先しているので、必要に応じて書き換えてください。
public static void SetProfile(VolumeProfile profile)
{
var volume = FindFirstObjectByType<Volume>(FindObjectsInactive.Include)
volume.profile = profile;
HashSet<string> names = new();
foreach (var component in volume.profile.components)
{
names.Add(component.name);
}
// Volume に存在する Render Feature を全て有効化. それ以外は無効化
var renderer = (UniversalRenderPipeline.asset.scriptableRenderer as UniversalRenderer);
var rendererFeatures = UniversalRenderPipeline.asset.rendererDataList[0].rendererFeatures;
foreach (var feature in rendererFeatures)
{
if (names.Contains(feature.name) == true)
{
feature.SetActive(true);
}
else
{
feature.SetActive(false);
}
}
}
Renderer には予め使用する Feature を全部登録しておきます。
その際、名前はクラス名に一致させておく必要があります。
Discussion