こんにちはVecpoly Gameです。
さて、Unityでカスタムカメラエフェクトを作成する、及び使用する方はかなりいるかと思います。
しかし、LWRPを使用すると、ほとんどの方がカスタムカメラエフェクトを使用する際、使うと思われる関数、「OnRenderImage」が呼び出されなくなります。
では、どうすればカスタムカメラエフェクトを使用することが出来るのでしょうか?
それは、Post Processing Stack v2のAPIを呼び出す必要があります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
using System;
[ExecuteInEditMode()]
[Serializable]
[PostProcess(typeof(renderer), PostProcessEvent.AfterStack, "mine/noise")]
public sealed class cc : PostProcessEffectSettings {
[SerializeField]
[Range(0, 1)]
public FloatParameter noiseX = new FloatParameter { value = 0.5f };
[SerializeField]
[Range(0, 1)]
public FloatParameter rgbNoise = new FloatParameter { value = 0.5f };
[SerializeField]
[Range(0, 1)]
public FloatParameter sinNoiseScale= new FloatParameter { value = 0.5f };
[SerializeField]
[Range(0, 10)]
public float sinNoiseWidth;
[SerializeField]
public float sinNoiseOffset;
[SerializeField]
public Vector2Parameter offset = new Vector2Parameter { };
[SerializeField]
[Range(0, 2)]
public FloatParameter scanLineTail = new FloatParameter { value = 1.5f};
[SerializeField]
[Range(-10, 10)]
public FloatParameter scanLineSpeed = new FloatParameter { value = 10f};
}
public sealed class renderer : PostProcessEffectRenderer<cc> {
private Material materialq;
private Shader s;
public override void Render(PostProcessRenderContext context)
{
s = Shader.Find("PostEffects/CRT");
var material = context.propertySheets.Get(s);
materialq = new Material(s);
materialq.SetFloat("_NoiseX", settings.noiseX);
materialq.SetFloat("_RGBNoise", settings.rgbNoise);
materialq.SetFloat("_SinNoiseScale", settings.sinNoiseScale);
materialq.SetFloat("_SinNoiseWidth", settings.sinNoiseWidth);
materialq.SetFloat("_SinNoiseOffset", settings.sinNoiseOffset);
materialq.SetFloat("_ScanLineSpeed", settings.scanLineSpeed);
materialq.SetFloat("_ScanLineTail", settings.scanLineTail);
materialq.SetVector("_Offset", settings.offset);
context.command.Blit(context.source, context.destination, materialq);
}
}
私はあるサイトを参考にした、ブラウン管風シェーダーを使用していたので上記の通りのプログラムになります。
プログラムの説明になりますが、
[PostProcess(typeof(renderer), PostProcessEvent.AfterStack, "mine/noise")]
これは、Post Processing stack上のメニューバーを追加するスクリプトになります。
public sealed class cc : PostProcessEffectSettings {
//何かのパラメータ
}
このクラスは、Post Processing stack上のパラメータを設定するクラスになります。
例えば、ここに
public FloatParameter rgbNoise = new FloatParameter { value = 0.5f };
と記入すれば"rgbNoise"というfloat型のパラメータが表示がされ、設定できるようになります。
ただ、
public float rgbNoise = 0.5f;
と書いても表示されません。
必ず、"~Parameter"といったものを使用してください。
無ければ、あきらめてください。
:test.cs
public sealed class renderer : PostProcessEffectRenderer<cc> {
private Material materialq;
private Shader s;
public override void Render(PostProcessRenderContext context)
{
s = Shader.Find("PostEffects/CRT");
var material = context.propertySheets.Get(s);
materialq = new Material(s);
materialq.SetFloat("_NoiseX", settings.noiseX);
materialq.SetFloat("_RGBNoise", settings.rgbNoise);
materialq.SetFloat("_SinNoiseScale", settings.sinNoiseScale);
materialq.SetFloat("_SinNoiseWidth", settings.sinNoiseWidth);
materialq.SetFloat("_SinNoiseOffset", settings.sinNoiseOffset);
materialq.SetFloat("_ScanLineSpeed", settings.scanLineSpeed);
materialq.SetFloat("_ScanLineTail", settings.scanLineTail);
materialq.SetVector("_Offset", settings.offset);
context.command.Blit(context.source, context.destination, materialq);
}
}
このコードでレンダリングをしているようです。
context.command.Blit(context.source, context.destination, materialq);
このコードは、OnRenderImageとよく似ています。
これで、ひとまずはエフェクトがかけられるようになります。
日本語のドキュメントはないですし、英語のドキュメントもほぼ無いので、探すのに時間がかかりました。
参考になれば幸いです。