Unity可编程渲染管线SRP

一、RenderPipeline类

通过SRP可以实现对渲染管线的完全控制,它提供了需要的工具来创建符合项目需求的渲染管线和效果;通过在C#脚本中定义一系列的命令来控制每一帧的渲染过程,和传统内置管线不同,它开放了更多的接口,给了开发者更大的自由度,但是又不至于像OpenGL手写管线那么复杂,可以很好满足开发者既需要自定义管线又要简单快捷的开发需求,降低了渲染管线的开发门槛;

该类用于srp中的渲染方式,它通过定义一系列的命令和设置来告诉unity怎么渲染一帧;

二、相关类

所有可编程渲染管线相关的类定义在UnityEngine.Rendering中;

1.RenderPipelineAsset

所有的管线资源都要继承自该类,并重写其创建管线的CreatePipeline()方法,返回一个RenderPipeline实例,并且需要将该值赋予到GraphicSettings,然后才可以使用这个自定义的管线来进行渲染;

2.GraphicsSettings

它和编辑器中的Project Settings中的Graphics的设置是紧密相关的,用于以脚本的方式来进行自动设置来代替手动设置;所以,它提供的属性和方法都是和设置面板相对应的;例如,创建一条管线后,就可以通过GraphicsSettings.renderPipelineAsset来将其设置为当前的渲染管线;

3.RenderPipeline

核心类,可编程的渲染管线的具体流程在此定义,所有的可编程渲染管线继承自该类,在创建新的管线资源时,需要使用到该类的子类进行实例化;

4.ScriptableRenderContext

渲染上下文,在自定义渲染管线中定义一些状态和渲染命令,然后调用Submit函数提交到GPU;这个上下文的概念类似于OpenGL中上下文的概念,定义渲染管线要使用的许多状态以及绘制命令,相当于整个渲染的manager;

SetupCameraProperties(camera):相机的配置是第一步,设置相机的属性,获取一个相机实例后,就可以获取它的观察矩阵(transform)和裁剪矩阵(clip plane等)等属性值;

5.CommandBuffer

它的出现早于SRP,在没有SRP时,它用于对unity内置的渲染管线进行扩展;该缓冲区用于存储一系列渲染命令,然后提交到渲染上下文中;

使用步骤:创建缓冲区-设置-提交-释放缓冲区

CommandBuffer buf=new CommandBuffer();
//设置渲染命令....
context.ExecuteCommandBuffer(buf) //非立即执行
buf.Release()

6.SortSettings 

设置场景中物体的排序方式,使用默认方式和使用自定义方式

  • 默认方式,设置criteria,这是一个SortingCriteria枚举类型,包含了透明物体(从前到后)、半透明(从后到前);
  • 自定义方式,设置cameraPosition、customAxi、worldToCameraMatrix三个变量联合使用;

三、第一步-完成一个最基础的渲染管线

  • 创建命令缓冲区,如下,设置清空渲染目标的命令;
  • 剔除操作,通过相机获取剔除参数,剔除场景中的不可见物体;
  • 绘制命令,绘制前需要对场景中的物体进行排序,为不同的物体设置不同的排序方式,比如半透明物体要从后到前渲染;在DrawingSettings中,构造函数第一个参数为ShaderTagId类型,也就是要使用的pass的tag的Id值,以及排序的设置;FilteringSettings则设置渲染队列的范围,用于设置哪些物体将会被渲染,如下例子,将透明和半透明分开进行渲染;
  • 注意:天空盒的渲染在不透明物体之后,在半透明物体之前
        var cmd = new CommandBuffer();
        CameraClearFlags clearFlags = camera.clearFlags;
        cmd.ClearRenderTarget((CameraClearFlags.Color&clearFlags)!=0,(CameraClearFlags.Depth&clearFlags)!=0,camera.backgroundColor);
        context.ExecuteCommandBuffer(cmd);
        cmd.Release();

        context.SetupCameraProperties(camera);

        //剔除
        ScriptableCullingParameters cullingPrama;
        camera.TryGetCullingParameters(out cullingPrama);
        CullingResults cullRet = context.Cull(ref cullingPrama);

        //绘制
        SortingSettings sortSettings = new SortingSettings(camera);
        sortSettings.criteria = SortingCriteria.CommonOpaque;
        DrawingSettings drawSettings = new DrawingSettings(new ShaderTagId("BasicPass"),sortSettings);
        FilteringSettings filterSettings = new FilteringSettings(RenderQueueRange.opaque);
        context.DrawRenderers(cullRet,ref drawSettings,ref filterSettings);

        context.DrawSkybox(camera);

        sortSettings.criteria = SortingCriteria.CommonTransparent;
        drawSettings.sortingSettings = sortSettings;
        filterSettings.renderQueueRange = RenderQueueRange.transparent;
        context.DrawRenderers(cullRet,ref drawSettings,ref filterSettings);

        context.Submit();

 

### Unity 可编程渲染管线概述 Unity可编程渲染管线(Scriptable Render Pipeline, SRP)允许开发者自定义游戏或应用的图形渲染过程。这种灵活性使得开发人员能够针对特定硬件优化性能,或是实现独特的视觉效果。 #### 自定义渲染管线的基础结构 为了构建一个自定义渲染管线,通常需要继承两个核心类:`RenderPipeline` 和 `RenderPipelineAsset`[^1]。前者负责实际的渲染逻辑执行;后者作为资源文件存在,便于管理和序列化配置参数。 ```csharp using UnityEngine; using UnityEngine.Rendering; public class CustomRenderPipeline : RenderPipeline { // 实现具体的渲染方法... } [System.Serializable] public class CustomRenderPipelineAsset : RenderPipelineAsset { protected override RenderPipeline CreatePipeline() { return new CustomRenderPipeline(); } } ``` #### 创建自定义渲染器 除了上述基础组件外,还需要定义一个新的渲染器来处理场景中的对象渲染工作。这可以通过派生自 `ScriptableRenderer` 类完成,并重写其中的关键函数以定制渲染行为[^2]: ```csharp using UnityEngine; using UnityEngine.Rendering; public class CustomScriptableRenderer : ScriptableRenderer { public CustomScriptableRenderer(RenderPipelineAsset asset) : base(asset) {} protected override void Render(ScriptableRenderContext context, Camera[] cameras) { foreach (var cam in cameras) { var sortingSettings = new SortingSettings(cam); var drawingSettings = new DrawingSettings(new ShaderTagId("CustomLit"), sortingSettings); var filteringSettings = FilteringSettings.defaultValue; context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings); } } } ``` #### 配置与管理SRP Asset SRP Asset本质上是一个 `ScriptableObject` ,这意味着它可以像其他任何脚本对象一样被编辑、保存并纳入版本控制系统之中。一旦创建好这些资产,在项目的图形设置中指定它们之后,Unity 将自动加载相应的渲染管线实例来进行渲染操作[^3]。 #### 扩展功能——几何着色器的应用 对于更复杂的图形特效来说,利用几何着色器可以在GPU上实时地对几何形状进行变换和增强。例如,生成额外的图元用于模拟毛发或其他细丝状物体的效果。这类高级特性极大地提升了画面的真实感和技术含量[^4]。 ```csharp // 假设这是在一个ShaderLab HLSL片段内的部分代码, // 展示了几何着色器如何接收输入顶点并将它们转换为新的图元。 [maxvertexcount(3)] void geom(point float4 IN[1] : POSITION, inout TriangleStream<float4> triStream) { [unroll] for(int i=0;i<3;++i){ float angle = radians(i * 120); // 每次旋转120度角 float4 newPos = mul(float4(IN[0].xyz + sin(angle)*float3(0.5,0,-0.5),1), unity_ObjectToWorld); triStream.Append(newPos); } triStream.RestartStrip(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值