Unity Scriptable Render Pipeline (SRP)学习笔记
可编写脚本的渲染管线?
参考链接:
SRP概述
SRP是新的Unity特性(目前于预览版,以后可能会发生大的变动),可使开发者完全掌控Unity渲染管线,允许开发者写C#脚本控制Unity渲染每一帧的方式。
可以在 Unity 2018.1+版本中使用.
SRP可以分为两部分: SRP asset和SRP 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 | [ExecuteInEditMode] |
上面代码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
22public 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)中放入的队列