1.Unity渲染学习之URP
Unity渲染学习之URP
Unity推出SRP系列已有时日,源码如今许多开发者都倾向于创建自己的分析渲染管线或对URP进行魔改。深入了解URP的源码运行处理方式,对我们今后构建自研渲染管线具有很好的分析借鉴意义。
本文将简要梳理URP的源码整个流程,但不会深入探讨某个模块的分析vb源码 打印 窗体具体实现,也不会涉及SRP的源码编写(关于这部分已有专家撰写了详细的教程系列)。若文中存在理解上的分析错误,敬请专家指正。源码
所有配图已上传至Github,分析若在本文中无法清晰查看,源码可前往该平台寻找对应的分析java类加载源码高清。
在Unity5多版本期间,源码我们一直使用的分析是内置的渲染管线(Built-in)。虽然它提供了一些渲染拓展接口,源码但面对用户日益增长的多样化需求,这些接口显得力不从心。而且,Unity并未像其他平台那样开源源码。因此,Unity在年推出了SRP(Scriptable Render Pipeline,可编程渲染管线)。SRP对底层渲染进行了更高级别的minishop商场源码封装,用户只需通过C#调用相关API,即可自定义渲染管线,筛选需要绘制的物体,指定材质,设置状态,并按照自己的需求进行渲染。这样一来,渲染开发的难度大大降低,因为Unity已经为我们处理了剔除、批处理等任务,我们只需关注自己的拐点买卖指标源码逻辑即可。
SRP推出之初,并非所有开发者都具备编写SRP的能力。因此,Unity同步推出了两个基于SRP开发的模板:HDRP(High Definition Render Pipeline,高清渲染管线)和LWRP(Lightweight Render Pipeline,轻量级渲染管线)。HDRP用于服务高性能设备,如PC、主机等;LWRP用于服务性能较低的设备,如移动端等。由于名字的火车轨指标源码原因,LWRP听起来就像是HDRP的阉割版,让开发者感到不满。随后,Unity将LWRP更名为URP(Universal Render Pipeline,通用渲染管线)。在SRP推出初期,bug频发,API也频繁变动。
目前Unity中留存的管线有原始的Built-in、基于SRP编写的URP和HDRP。本文主要学习URP的流程处理方式。
SRP切换渲染管线是通过Edit -> Project Settings -> Graphics -> Scriptable Render Pipeline Settings来指定对应的渲染管线资产实现的。因此,我们查看URP的入口就是从RenderPipelineAsset开始的。
在编写自己的渲染管线时,我们希望各个功能模块化、可扩展性高、调用关系明确。以下简单介绍URP的组织结构。
还有一个重要的概念是pass,它表示渲染的某个阶段,例如渲染阴影、不透明、半透明、skybox、后处理等。URP提供了一个ScriptableRenderPass基类用于拓展我们的pass,指定我们想要渲染的内容。我们只需将这些pass添加到渲染队列中,URP在具体渲染时会对这些pass进行排序,然后执行绘制。
简单了解了这些概念后,我们可以看看URP的渲染逻辑。URP的整体逻辑如下:
核心的pass实现可以独立出来,想要执行只需将其插入即可。
具体渲染时,Unity会调用渲染管线的Render(...)函数进行一帧的绘制。Render(...)首先初始化全局渲染设置,然后遍历每个相机,对每个相机进行渲染。
接下来简单看看将pass添加到渲染队列的实现:
可以看到这里是按照渲染顺序依次添加了要绘制的pass(其实不按照顺序也可以,因为在执行时会对这些pass进行排序)。在绘制不透明物体时,也分为延迟渲染和前向渲染两个路线。
接下来看看执行这些pass的逻辑:
这里主要是对pass进行排序、分块,设置一些参数,依次执行每个部分,最后绘制一些小玩意。
本文主要简要介绍了URP的处理流程,让大家了解其组织结构。这样在编写SRP或调试URP时,也能作为参考。URP的核心渲染实现是ScriptableRenderPass,这样的设计方便我们日后添加自己的渲染功能,例如使用Render Feature。以下是URP全家福: