SimplePostEffects
keijiro神の URP SimplePostEffectsをみて、新しいUnity2021でのShaderGraphとPosteffectについて勉強してみました。
本家のリポジトリにはREADMEがなかったので、以下は独自に分解してみた解説です。
環境
- Unity2021.2.13f1 (Windows版で実験しています)
(まずはデモ)ShaderGraphを試してみる
とりあえず本家のプロジェクトが意図しているであろう Inverse
という処理を Material と ShaderGraph の OneMinus
で書いているので Remap
に置き換えてみます!
もともとのレンダリング結果(Test.unity)
Asset/Posteffectの Invert
を開く。左はマテリアルで、Shader Graphs/Invert
を指定している。Surface Inputとして MainTex
を指定して、これをShaderGraph内で操作するのね。
左上の”Save Asset”を押すのが必要なのに気づかなかった…が、わかればこれは楽しい…。
シーンを分解してみる
Camera
- Post Processing
- Dithering
- Ocullusion Culling (check off)
Background color
を Solid Color
で黒などにしておくのは大事かもしれない。
カメラの下には Postprocess
という名前のGameobject、Volume
→ Global Volume
で作成できる。
Profile
には Assets/Misc/Postprocess.asset
がアタッチされており、これは Global Volume Processというオブジェクト。
- Bloom
- Tonemapping
- Chromatic Aberration (色収差)
- Shadows Midtones Highlights
が設定されている。
たとえば Bloom
なら
- Threshold : 0
- Intensity : 0.4
- Scatter : 0.9
という感じ。
ちなみにこのあたりのパラメータはエディタ上で(Runしなくても)リアルタイムで反映されるので楽しい。
Intensity
を、ぐっと 9ぐらい まで上げてみています。
実行すると、こんな感じです。
ShaderGraph と スクリプト について
ShaderGraph についての詳細はまたの機会にしますが、冒頭に書いた通り、見よう見まねで作ることができました。
左上のボタン Save Asset
で、保存をするのを忘れずに。これはリアルタイム反映されないのかな?
スクリプトとしては UniversalAdditionalCameraData.cs
PostEffectFeature.cs
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace UrpTestbed {
sealed class PostEffectPass : ScriptableRenderPass
{
public Material material;
public override void Execute
(ScriptableRenderContext context, ref RenderingData data)
{
if (material == null) return;
var cmd = CommandBufferPool.Get("PostEffect");
Blit(cmd, ref data, material, 0);
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
}
public sealed class PostEffectFeature : ScriptableRendererFeature
{
public Material material;
PostEffectPass _pass;
public override void Create()
=> _pass = new PostEffectPass
{ material = material,
renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing };
public override void AddRenderPasses
(ScriptableRenderer renderer, ref RenderingData data)
=> renderer.EnqueuePass(_pass);
}
} // namespace UrpTestbed
ちなみに UVChecker も ShaderGraph で作られている
かっけえ