Scritpable render pipleline

Unity Scriptable Render Pipeline (SRP)学习笔记

可编写脚本的渲染管线?

参考链接:

  1. Unity Scriptable Render Pipeline
  2. SRP Wiki
  3. Scriptable Render Pipeline Overview
  4. The Lightweight Render Pipeline: Optimizing Real Time Performance
  5. SRP-Demo

SRP概述

SRP是新的Unity特性(目前于预览版,以后可能会发生大的变动),可使开发者完全掌控Unity渲染管线,允许开发者写C#脚本控制Unity渲染每一帧的方式。
可以在 Unity 2018.1+版本中使用.

SRP可以分为两部分: SRP assetSRP instance。两者在自制渲染管线时都很重要。

SRP Asset

SRP Asset是一个project asset,表示渲染管线的一个具体配置(specific configuration),例如:

  • 是否应该投下阴影
  • 使用什么着色器质量级别(shader quality level)
  • 阴影距离是多少
  • 默认材质配置
    SRP Asset表示SRP的类型(type)和配置(settings)

SRP Instance

**SRP instance是实际完成渲染(rendering)的类(class)。

当Unity发现SRP开启时,它会查看当前使用的SRP asset,要求其提供一个’rendering instance’。

SRP Instance表示一个管道配置(pipeline configuration)。渲染器调用Instance,则可以完成以下动作:

  • 清除帧缓存(Clearing the framebuffer)
  • 完成场景剔除(Performing scene culling)
  • 渲染一些对象(Rendering sets of objects)
  • 完成blit操作(Doing blits from one frame buffer to another)
  • 渲染阴影(Rendering shadows)
  • 实施后处理效果(Applying post process effects)

简单的SRP例子

由上面的叙述可知,SRP Asset是一个ScriptableObject,它包含渲染管线相关的配置,可以返回一个渲染管线实例,用于渲染,替代Unity标准的渲染(standard Unity rendering)。

如果SRP asset上的一个设置(setting)发生了改变,所有对应的已创建的SRP instance将会被销毁,并在渲染下一帧时创建新的instance(带有改变后的新设置settings)。

下面是一个简单地SRP asset类,它包含一个color,由返回的Instance使用,使用clearColor来清除屏幕。
其中CreateBasicAssetPipeline()方法只能在Editor模式下使用,它用于创建这个asset。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[ExecuteInEditMode]
public class BasicAssetPipe : RenderPipelineAsset
{
public Color clearColor = Color.green;

#if UNITY_EDITOR
// Call to create a simple pipeline
[UnityEditor.MenuItem("SRP-Demo/01 - Create Basic Asset Pipeline")]
static void CreateBasicAssetPipeline()
{
var instance = ScriptableObject.CreateInstance<BasicAssetPipe>();
UnityEditor.AssetDatabase.CreateAsset(instance, "Assets/BasicAssetPipe.asset");
}
#endif

// Function to return an instance of this pipeline
protected override IRenderPipeline InternalCreatePipeline()
{
return new BasicPipeInstance(clearColor);
}
}

上面代码InternalCreatePipeline()返回的BasicPipeInstance即为SRP Instance。必须实现创建Instance类,因为所有的渲染逻辑都在它里面。

最简单的SRP Instance可以仅包含一个Render方法,有两个参数,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class BasicPipeInstance : RenderPipeline
{
private Color m_ClearColor = Color.black;

public BasicPipeInstance(Color clearColor)
{
m_ClearColor = clearColor;
}

public 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();
}
}

这个pipeline就是完成了使用给定的颜色m_ClearColor来清除屏幕。注意:

  • CommandBuffer可以用来完成许多操作(此处是ClearRenderTarget )
  • CommandBuffer被放入context
  • 渲染的最后一步是调用Submit,这会执行渲染环境(render contex)中放入的队列