スクリプタブルレンダーパイプラインの概要
https://blogs.unity3d.com/jp/2018/01/31/srp-overview/
こちらのブログについて Unity 2019.1 以降で CullingResults, DrawRendererSettings の個所などでエラーが発生して動作しなくなりました。
これはこのクラスがExperimentalに指定されて、Unity 2019.1 以降のバージョンでは利用できなくなりました。次のように書き換えると動作しました。
BasicAssetPipe.cs
using UnityEngine;
using UnityEngine.Rendering;
// using UnityEngine.Experimental.Rendering;
[ExecuteInEditMode]
public class BasicAssetPipe : RenderPipelineAsset
{
public Color clearColor = Color.green;
#if UNITY_EDITOR
[UnityEditor.MenuItem("SRP-Demo/01 - Create Basic Asset Pipeline")]
static void CreateBasicAssetPipeline()
{
var instance = ScriptableObject.CreateInstance<BasicAssetPipe>();
UnityEditor.AssetDatabase.CreateAsset(instance, "Assets/SRP-Demo/1-BasicAssetPipe/BasicAssetPipe.asset");
}
#endif
protected override RenderPipeline CreatePipeline()
{
return new BasicPipeInstance(clearColor);
}
}
public class BasicPipeInstance : RenderPipeline
{
private Color m_ClearColor = Color.black;
public BasicPipeInstance(Color clearColor)
{
m_ClearColor = clearColor;
}
protected override void Render(ScriptableRenderContext context, Camera[] cameras)
{
// does not so much yet :()
// base.Render(context, cameras);
// clear buffers to the configured color
var cmd = new CommandBuffer();
cmd.ClearRenderTarget(true, true, m_ClearColor);
context.ExecuteCommandBuffer(cmd);
cmd.Release();
context.Submit();
}
}
OpaqueAssetPipe.cs
using System;
using UnityEngine;
using UnityEngine.Rendering;
// using UnityEngine.Experimental.Rendering;
[ExecuteInEditMode]
public class OpaqueAssetPipe : RenderPipelineAsset
{
#if UNITY_EDITOR
[UnityEditor.MenuItem("SRP-Demo/02 - Create Opaque Asset Pipeline")]
static void CreateBasicAssetPipeline()
{
var instance = ScriptableObject.CreateInstance<OpaqueAssetPipe>();
UnityEditor.AssetDatabase.CreateAsset(instance, "Assets/SRP-Demo/2-OpaqueAssetPipe/OpaqueAssetPipe.asset");
}
#endif
protected override RenderPipeline CreatePipeline()
{
return new OpaqueAssetPipeInstance();
}
}
public class OpaqueAssetPipeInstance : RenderPipeline
{
protected override void Render(ScriptableRenderContext context, Camera[] cameras)
{
// base.Render(context, cameras);
foreach (var camera in cameras)
{
// Culling
ScriptableCullingParameters cullingParams;
if (!(camera.TryGetCullingParameters(out cullingParams)))
continue;
var cull = context.Cull(ref cullingParams);
// Setup camera for rendering (sets render target, view/projection matrices and other
// per-camera built-in shader variables).
context.SetupCameraProperties(camera);
// clear depth buffer
var cmd = new CommandBuffer();
cmd.ClearRenderTarget(true, false, Color.black);
context.ExecuteCommandBuffer(cmd);
cmd.Release();
// Draw opaque objects using BasicPass shader pass
var settings = new DrawingSettings(new ShaderTagId("BasicPass"), new SortingSettings(camera));
settings.sortingSettings = new SortingSettings() { criteria = SortingCriteria.CommonOpaque };
var filterSettings = new FilteringSettings(renderQueueRange: RenderQueueRange.opaque);
context.DrawRenderers(cull, ref settings ,ref filterSettings);
// Draw skybox
context.DrawSkybox(camera);
context.Submit();
}
}
}
TransparentAssetPipe.cs
using System;
using UnityEngine;
using UnityEngine.Rendering;
// using UnityEngine.Experimental.Rendering;
[ExecuteInEditMode]
public class TransparentAssetPipe : RenderPipelineAsset
{
#if UNITY_EDITOR
[UnityEditor.MenuItem("SRP-Demo/03 - Create Transparent Asset Pipeline")]
static void CreateBasicAssetPipeline()
{
var instance = ScriptableObject.CreateInstance<TransparentAssetPipe>();
UnityEditor.AssetDatabase.CreateAsset(instance, "Assets/SRP-Demo/3-TransparentAssetPipe/TransparentAssetPipe.asset");
}
#endif
protected override RenderPipeline CreatePipeline()
{
return new TransparentAssetPipeInstance();
}
}
public class TransparentAssetPipeInstance : RenderPipeline
{
protected override void Render(ScriptableRenderContext context, Camera[] cameras)
{
// base.Render(context, cameras);
foreach (var camera in cameras)
{
// Culling
ScriptableCullingParameters cullingParams;
if (!(camera.TryGetCullingParameters(out cullingParams)))
continue;
var cull = context.Cull(ref cullingParams);
// Setup camera for rendering (sets render target, view/projection matrices and other
// per-camera built-in shader variables).
context.SetupCameraProperties(camera);
// clear depth buffer
var cmd = new CommandBuffer();
cmd.ClearRenderTarget(true, false, Color.black);
context.ExecuteCommandBuffer(cmd);
cmd.Release();
// Draw opaque objects using BasicPass shader pass
var settings = new DrawingSettings(new ShaderTagId("BasicPass"), new SortingSettings(camera));
settings.sortingSettings = new SortingSettings() { criteria = SortingCriteria.CommonOpaque };
var filterSettings = new FilteringSettings(renderQueueRange: RenderQueueRange.opaque);
context.DrawRenderers(cull, ref settings, ref filterSettings);
// Draw skybox
context.DrawSkybox(camera);
settings.sortingSettings = new SortingSettings() { criteria = SortingCriteria.CommonTransparent };
filterSettings = new FilteringSettings(renderQueueRange: RenderQueueRange.transparent);
context.DrawRenderers(cull, ref settings, ref filterSettings);
context.Submit();
}
}
}
こちらのサイトが参考になりました。
LWRP 4-preview を2019.1で動かすように改造した話
https://connect.unity.com/p/lwrp-4-preview-wo2019-1dedong-kasuyounigai-zao-shitahua
Unity Scriptable Render Pipeline(SRP)はパッケージマネージャーからUniversal Render Pipeline(URP, 2019より前はLightweight Render Pipeline(LWRP))、HD レンダーパイプライン(HDRP)をチェックしなくても利用できます。