本文重点:
1、创建管线资产和实例
2、剔除、过滤、排序、渲染
3、保持内存干净
4、提供良好的编辑体验
这是涵盖Unity可编写脚本的渲染管线的教程系列的第一部分。本教程假定您首先阅读了Unity基础系列教程。Unity基础渲染系列的前几部分也很有用。
本教程使用Unity 2018.3.0f2制作。
本教程是CatLikeCoding系列的一部分,原文地址见文章底部。“原创”标识意为原创翻译而非原创教程。
那么其他SRP系列呢?
我还有另一个教程系列,涉及可编写脚本的渲染管线。它是为Unity 2019及更高版本而设计的,而此版本使用仅适用于Unity 2018的实验性SRP API。另一系列采用了一种不同且更现代的方法,但将涉及许多相同的主题。如果你不想等到新系列赶上它,那么完成本系列的阅读仍然非常有用。
(新渲染管线的新生)
1 创建一个管线
要渲染任何物体,Unity必须确定要绘制哪些形状,在何时何地以及使用什么设置。这可能会变得非常复杂,具体取决于所涉及的效果。灯光,阴影,透明度,图像效果,体积效果等都必须以正确的顺序处理,以得到最终的图像。此过程称为渲染管线。
Unity 2017支持两个预定义的渲染管线,一个用于正向渲染,一个用于延迟渲染。它还支持Unity 5中引入的较旧的延迟渲染方法。这些管线是固定的。你可以启用,禁用或覆盖管线的某些部分,但是不可能完全偏离其设计。
Unity 2018增加了对可脚本化渲染管线的支持,尽管你仍然必须依靠Unity进行许多单独步骤(例如剔除),但仍可以从头开始设计管线。Unity 2018引入了两种使用这种新方法制作的新管线,即轻量级管线和高清管线。这两个管线仍处于预览阶段,可编写脚本的渲染管线API仍被标记为实验技术。但现在,它足以让我们继续创建自己的管线。
在本教程中,我们将设置一个最小的渲染管线来绘制不受光的形状。一旦可行的话,我们可以在以后的教程中扩展我们的管线,添加照明,阴影等更多高级功能。
1.1 项目设置
打开Unity 2018并创建一个新项目。我正在使用Unity 2018.2.9f1,但任何2018.2版本或更高版本也适用。创建一个禁用分析功能的标准3D项目。我们将创建自己的管线,因此请不要选择任何管线选项。
打开项目后,通过Window / Package Manager进入软件包管理器,并删除默认情况下包含的所有软件包,因为我们不需要它们。只保留无法删除的Package Manager UI。
(开始工程)
我们将在线性色彩空间中工作,但Unity 2018仍将gamma空间用作默认值。因此,请通过“Edit/ Project Settings / Player”转到播放器设置,然后将“Other Settings”部分中的“Color Space”切换为“Linear”。
(线性色彩空间)
我们需要一些简单的材质来测试我们的管线。我创建了四种材质。首先,默认的标准不透明材质具有红色反照率。其次,相同的材质,但“渲染模式”(Rendering Mode)设置为“Transparent ”(透明),蓝色反照率,透明度降低。第三,使用使用“Unlit/Color”着色器的材质,其颜色设置为黄色。最后,使用“Unlit/Transparent”着色器的材质没有任何更改,因此显示为纯白色。
(测试材质)
用所有四种材质,在场景中实例化一些对象。
(场景显示4个材质)
1.2 管线Asset
当前,Unity使用默认的前向渲染管线。要使用自定义管线,我们必须在图形设置中选择一个,可以通过“Edit/ Project Settings / Graphics.”找到。
(使用默认管线)
要设置自己的管线,必须将管线资产分配给“Scriptable Render Pipeline Settings”字段。这些资产必须继承自RenderPipelineAsset,它是ScriptableObject类型。
为我们的自定义管线资产创建一个新脚本。将管线命名为My Pipeline。因此,其资产类型将为MyPipelineAsset,并且必须继承自RenderPipelineAsset,该属性在UnityEngine.Experimental.Rendering命名空间中定义。
它将始终处于试验性名称空间中吗?
它将在某个时候移出实验性名称空间,移至UnityEngine.Rendering或另一个名称空间。发生这种情况时,除非API也被更改,否则只需更新using语句即可。
管线资产的主要目的是为Unity提供一种获取负责渲染的管线对象实例的方法。资产本身只是句柄和存储管线设置的地方。我们还没有任何设置,因此我们要做的就是为Unity提供一种获取管线对象实例的方法。这是通过重写InternalCreatePipeline方法来完成的。但是我们还没有定义管线对象类型,因此现在只返回null。
InternalCreatePipeline的返回类型为IRenderPipeline。类型名称的I前缀表示它是接口类型。
什么是接口?
现在,我们需要将这种类型的资产添加到项目中。为此,请将CreateAssetMenu属性添加到MyPipelineAsset。
这在“Asset / Create menu”菜单中放置一个条目。让我们保持整洁并将其放在“Rendering”子菜单中。为此,我们将属性的menuName属性设置为“Rendering/My Pipeline”。可以在属性类型之后直接在圆括号中设置属性。
使用新菜单项将资产添加到项目中,将其命名为“My Pipeline”。