ScriptableRenderPipeline学习(1)

ScriptableRenderPipeline学习(1)

  • 项目地址
  • 引言
  • SRP简介
  • SRP安装
  • Hello World程序
  • SRP资源创建

项目地址

https://github.com/0odrifto0/CustomRenderPipeline

引言

Unity 目前引入了一种脚本化的渲染管线(SRP),与之前加入的CommandBuffer只能对现有管线的各个阶段做一些定制工作相比,SRP拥有更多的灵活性,利用它开发者能更加轻松的定制符合自己需求的渲染管线。本系列希望借助SRP学习一下游戏渲染的各方面的知识。

SRP简介

SRP实际是通过C#脚本将一些必要的接口暴露给开发者,使开发者可以在脚本层去修改和构建自己的渲染管线,官方也利用这套系统实现了两个SRP:一个是面向移动设备的轻量渲染管线,一个是面向主机、高端PC的高清渲染管线。开发者可以根据自己的实际情况选择,也可以方便的在此基础上定制。

SRP安装

目前所使用的Unity版本是2018.3,此版本安装SRP的方法是直接到Package Manager中找到Core RP Library安装即可,如果打开看不到这一项,可以看看红色箭头处是否勾选了显示预览包的选项,因为目前SRP还处于预览状态。ScriptableRenderPipeline学习(1)_第1张图片ScriptableRenderPipeline学习(1)_第2张图片

Hello World程序

国际惯例,先让SRP能够跑起来。要创建新的渲染管线需要继承RenderPipeline这个类。

public class CustomRenderPipeline : RenderPipeline
{
    public override void Render(ScriptableRenderContext renderContext, Camera[] cameras)
    {
        base.Render(renderContext, cameras);

        var cmd = new CommandBuffer();
        cmd.ClearRenderTarget(true, true, Color.gray);
        renderContext.ExecuteCommandBuffer(cmd);
        cmd.Release();
        renderContext.Submit();
    }
}

这个类有一个Render的方法,重载它我们就可以在里面实现自己的渲染逻辑,可以看到方法的第一个参数类型是ScriptableRenderContext,从名字可以看出这个是渲染的Context对象,SRP是延迟执行的,在用户利用CommandBuffer填充了各种渲染命令后,由这个Context对象去完成渲染命令的提交。Camera数组代表参与渲染的摄像机。在这个HelloWorld程序里,我们构造了一个新的CommandBuffer,然后用指定颜色清除了RenderTarget(屏幕),然后将这个CommandBuffer加入到Context的渲染队列,最后提交执行。完成的效果就是屏幕变为灰色。

SRP资源创建

要让自定义的SRP跑起来,还得先创建这个SRP的管线资源,方法是继承RenderPipelineAsset这个类,重载InternalCreatePipeline方法

[ExecuteInEditMode]
public class CustomRenderPipelineAsset : RenderPipelineAsset
{
#if UNITY_EDITOR
    [UnityEditor.MenuItem("SRP/Create Custom Render Pipeline")]
    static void CreatePipelineAsset()
    {
        var inst = ScriptableObject.CreateInstance();
        UnityEditor.AssetDatabase.CreateAsset(inst, "Assets/SRP/CustomRenderPipeline.asset");
    }
#endif
    protected override IRenderPipeline InternalCreatePipeline()
    {
        return new CustomRenderPipeline();
    }
}

之后可以在编辑器下生成对应的资源,然后在ProjectSetting中设置SRP为新创建的即可
ScriptableRenderPipeline学习(1)_第3张图片
不出意外应该可以看到屏幕变成了灰色。

你可能感兴趣的:(Unity)