文章

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特定的绘制命令的组合。

本文由作者按照 CC BY 4.0 进行授权