SRP入门概念
总览
从较高的角度来看,可以将SRP分为两部分,即SRP资产和SRP实例。创建自定义渲染管道时,需要同时实现两者。
SRP资产
SRP资产是一个Unity资产,代表管道的特定配置。它存储以下信息:
- GameObjects是否应投射阴影。
- 要使用什么Shader质量级别。
- 阴影距离。
- 默认材料配置。
想要控制并保存为配置一部分的内容;Unity需要序列化的所有内容。SRP资产代表SRP的类型以及可以为其配置的设置。
SRP实例
SRP实例是实际执行渲染的类。当Unity看到项目使用SRP时,它将查看当前的SRP资产,并要求其提供渲染实例。资产必须返回包含Render函数的实例。通常,该实例还从SRP资产中缓存许多设置。
该实例代表管道配置。在渲染调用中,Unity可以执行以下操作:
- 清除帧缓冲区。
- 执行场景剔除。
- 渲染游戏对象集。
- 从一帧缓冲区到另一帧缓冲区。
- 渲染阴影。
- 应用后期处理效果。
该实例表示Unity执行的实际渲染。
SRP资产
SRP资产包含可用于配置渲染管道的接口。Unity首次执行渲染时,它将调用 InternalCreatePipeline
,并且Asset必须返回可用的渲染实例。
SRP资产本身是ScriptableObject,这意味着它可以是项目资产,并且可以将其保存在项目中,并且版本控制可以正确使用它。如果要保存配置供其他人使用,则需要在项目中创建SRP资产。可以像通过脚本一样创建任何其他ScriptableObject一样创建SRP,然后通过Asset Database API保存它。
要使Unity在的项目中使用SRP资产,需要通过GraphicsSettings设置资产。在此处设置资产参考时,Unity将在项目中使用SRP渲染,并将渲染从标准Unity渲染转移到SRP资产提供的配置。
除了返回实例并保存配置数据外,还可以使用SRP资产来提供许多辅助功能,例如:
- 创建3d GameObjects时要使用的默认材质。
- 创建2D GameObjects时要使用的默认材质。
- 创建粒子系统时要使用的默认材质。
- 创建地形时要使用的默认材质。
这实质上是提供挂钩点,以确保端到端编辑器体验正确。如果构建一个管道并希望它模仿现有Unity管道的编辑器行为,那么这些步骤是必需的。
SRP资产示例
资产包含渲染属性,并返回Unity可以用来渲染场景的管道实例。如果资产上的设置发生更改,Unity将销毁所有当前实例,并使用新设置创建一个新实例以用于下一帧。
下面的示例显示了SRP资产类。它包含SRP实例用来清除屏幕的颜色。还有一些仅编辑器的代码可帮助用户在项目中创建SRP资产。
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);
}
}
SRP实例
该SRP资产控制配置,但SRP实例是渲染切入点。在开发SRP时,还需要创建此类,因为这是所有呈现逻辑所在的位置。
在最简单的形式中,SRP实例仅包含一个函数Render,最好的考虑方式是它是一块空白画布,可以在其中自由选择以自己认为合适的方式进行渲染。在渲染函数有两个参数
- A ScriptableRenderContext 是命令缓冲区的一种,可以在其中排队要执行的渲染操作。
- 一组Cameras表示用于渲染。
基本管道
在Render函数中,可以执行诸如剔除,过滤,更改渲染目标和绘图之类的步骤。
该示例代码的作用是执行简单的清除操作,将屏幕显示为Unity创建SRP实例时在SRP资产中设置的给定清除颜色。
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();
}
}
有几件事要注意:
- SRP将现有的Unity CommandBuffers用于许多操作(ClearRenderTarget在这种情况下)。
- SRP根据传入的上下文调度CommandBuffer。
- 在SRP中渲染的最后一步是调用Submit。这将在渲染上下文中执行所有排队的命令。
SRP上下文
SRP使用延迟执行的概念进行渲染。建立命令列表,然后执行它们。用于构建这些命令的对象称为ScriptableRenderContext
并将其作为参数传递给Render函数。
当用操作填充SRP上下文时,然后可以调用Submit提交所有排队的渲染调用,这些调用通常是CommandBuffer执行以及SRP特定的绘制命令的组合。