Unity手册-渲染管线

渲染管线(Rendering Pipeline)可以指很多东西,但是在现在的语境下,我们将渲染管线形容为CPU为了渲染一帧所需要的全部渲染相关的代码。游戏中图像的渲染需要CPU和GPU共同完成,其中CPU负责处理一些“全局”的任务,比如决定每一个绘制指令(Drawcall)中需要提供给GPU的物体、灯光,设置显卡的渲染流水线(这是另一个东西,用来表示一个Drawcall中绘制的整个流程,不要弄混了~),然后同时显卡去进行渲染。而显卡负责“细节”任务,我们可以使用着色器(Shader)代码来给显卡编程,指定如何让显卡去真正绘制我们想要的图案。渲染管线应该和着色器成为一个整体考虑,着色器代码决定如何绘制具体的效果,而渲染管线则控制“应该绘制什么”以及“使用哪些着色器来进行绘制”等问题。
在以往的Unity版本中,渲染管线虽然可以配置,但是仍然只能使用Unity自带的多个渲染管线(内置渲染管线)中的一个,因此在编写着色器代码的时候难免会有些拘束,有很多功能使用内置渲染管线无法实现。而在2018添加了可编程渲染管线(SRP)的功能以后,我们几乎就可以完全自己决定整个画面的表现了
(摘录:https://zhuanlan.zhihu.com/p/35681027)

Unity 提供以下渲染管线:

  • 内置渲染管线是 Unity 的默认渲染管线。这是通用的渲染管线,其自定义选项有限。
  • 通用渲染管线 (URP) 是一种可快速轻松自定义的可编程渲染管线,允许您在各种平台上创建优化的图形。
  • 高清渲染管线 (HDRP) 是一种可编程渲染管线,可让您在高端平台上创建出色的高保真图形。
  • 可以使用 Unity 的可编程渲染管线 API 来创建自定义的可编程渲染管线 (SRP)。这个过程可以从头开始,也可以修改 URP 或 HDRP 来适应具体需求。

内置渲染管线

内置渲染管线中的渲染路径

可在 Graphics 窗口中选择项目使用的渲染路径,并可为每个摄像机覆盖该路径。

如果运行项目的设备上的 GPU 不支持所选的渲染路径,则 Unity 将自动使用较低保真度的渲染路径。例如,在无法处理延迟着色的 GPU 上,Unity 使用前向渲染。

一、前向渲染路径
前向渲染是内置渲染管线中的默认渲染路径。这是通用的渲染路径。
采用前向渲染方式渲染实时光源会非常消耗资源。如果项目没有使用大量实时光源,或者光照保真度对项目而言不重要,则此渲染路径可能是这个项目的不错选择。

  1. 实现详细信息
    在前向渲染中,影响每个对象的一些最亮的光源以完全逐像素光照模式渲染。然后,最多 4 个点光源采用每顶点计算方式。其他光源以球谐函数 (SH) 计算,这种计算方式会快得多,但仅得到近似值。光源是否为每像素光源根据以下原则而定:
    ①Render Mode 设置为 Not Important 的光源始终为每顶点或 SH 光源。
    ②最亮的方向光始终为每像素光源。
    ③Render Mode 设置为 Important 的光源始终为每像素光源。
    如果上述情况导致光源数少于当前的 Pixel Light Count 质量设置,则按照亮度降低的顺序,更多光源采用每像素渲染方式。

    每个对象的渲染按如下方式进行:
    基础通道应用一个每像素方向光和所有每顶点/SH 光源。(ForwardBase)
    ②其他每像素光源在额外的通道中渲染(每个光源对应一个通道)(ForwardAdd)。
    例如,如果某个对象受到许多光源的影响(下图中的圆形受光源 A 到 H 的影响):
    Unity手册-渲染管线_第1张图片
    让我们假设光源 A 到 H 具有相同的颜色和强度,并且所有光源都具有自动渲染模式,因此它们将严格按照此对象的以下顺序排序。最亮的光源将以每像素光照模式渲染(A 到 D),然后最多 4 个光源以每顶点光照模式渲染(D 到 G),最后其余光源以 SH 进行渲染(G 到 H):
    Unity手册-渲染管线_第2张图片
    请注意,光源组会重叠;例如,最后一个每像素光源混合到每顶点光照模式,因此当对象和光源移动时,“光射量”(light popping) 较少。

  2. 基础通道(ForwardBase)
    基础通道使用一个每像素方向光和所有 SH/每顶点光源来渲染对象。此通道还会添加着色器中的所有光照贴图、环境光照和发射光照。在此通道中渲染的方向光可以具有阴影。请注意,光照贴图的对象不会从 SH 光源获得光照

    请注意,在着色器中使用“OnlyDirectional”通道标志时,前向基础通道仅渲染主方向光、环境光/光照探针和光照贴图(SH 和顶点光源不包括在通道数据中)。

  3. 其他通道(ForwardAdd)
    对于影响此对象的每个额外的每像素光源,需要额外的渲染通道。默认情况下,这些通道中的光源没有阴影(因此在结果中,前向渲染支持一个带阴影的方向光),除非使用 multi_compile_fwdadd_fullshadows 变体快捷方式。

  4. 性能注意事项
    球谐函数光源的渲染速度_很_快。这些光源的 CPU 成本很低,并且使用 GPU 的_成本基本为零_(也就是说,基础通道始终会计算 SH 光照;但由于 SH 光源工作方式的原因,无论 SH 光源有多少,成本都完全相同)。

    SH 光源的缺点:
    ①按对象的顶点而不是按像素计算。这意味着它们不支持光照剪影和法线贴图。
    ②SH 光照的频率很低。SH 光源无法实现快速的光照过渡。它们也只影响漫射光照(频率对镜面高光而言太低)。
    ③SH 光照不是局部光照;SH 点光源或聚光灯在靠近某种表面时“看起是错误的”。

    总的来说,SH 光源通常足以达到小型动态对象的光照要求。

二、延迟渲染路径
延迟着色是内置渲染管线中具有最大光照和阴影保真度的渲染路径。
延迟着色需要 GPU 支持,并且有一些局限性。这种着色方式不支持半透明对象(Unity 使用前向渲染来渲染这些对象)、正交投影(Unity 对这些摄像机使用前向渲染)或硬件抗锯齿(但可以使用后期处理效果来获得类似结果)。延迟着色对剔除遮罩的支持有限,并会将 Renderer.receiveShadows 标志始终视为 true。
如果项目具有大量的实时光源并需要高级别的光照保真度,而目标硬件支持延迟着色,那么此渲染路径对于该项目而言可能是一个不错的选择

  1. 概述
    使用延迟着色时,可影响游戏对象的光源数量没有限制。所有光源都按像素进行评估,这意味着它们都能与法线贴图等正确交互。此外,所有光源都可以有剪影和阴影。

    延迟着色的优点是,光照的处理开销与接受光照的像素数成正比。这取决于场景中的光量大小,而不管接受光照的游戏对象有多少。因此,可通过减少光源数量来提高性能。延迟着色还具有高度一致和可预测的行为。每个光源的效果都是按像素计算的,因此不会有在大三角形上分解的光照计算。

    在缺点方面,延迟着色并不支持抗锯齿,也无法处理半透明游戏对象(这些对象使用前向渲染进行渲染)。此外,它也不支持网格渲染器 (Mesh Renderer) 的接受阴影 (Receive Shadows) 标志,并且仅在有限程度上支持剔除遮罩。最多只能使用四个剔除遮罩。也就是说,剔除层遮罩必须至少包含所有层减去四个任意层,即必须设置 32 个层中的 28 个层。否则,会产生图形瑕疵。

  2. 要求
    延迟着色要求显卡具有多渲染目标 (MRT)、着色器模型 3.0(或更高版本)并支持深度渲染纹理。从 GeForce 8xxx、Radeon X2400、Intel G45 开始,2006 年以后制造的大多数 PC 显卡都支持延迟着色。

    所有至少运行 OpenGL ES 3.0 的移动设备都支持延迟着色。

    注意:使用正交投影 (Orthographic projection) 时不支持延迟渲染。如果摄像机的投影模式设置为正交模式,则摄像机将回退到前向渲染。

  3. 性能注意事项
    延迟着色中的实时光源的渲染开销与接受光照的像素数成比例,并_不_依赖于场景复杂度。所以小型点光源或聚光灯的渲染成本非常低,如果它们被场景游戏对象完全或部分遮挡,那么成本甚至更低。

    当然,有阴影的光源比没有阴影的光源的成本高得多。在延迟着色中,对于每个阴影投射光源,仍然需要将投射阴影的游戏对象渲染一次或多次。此外,应用阴影的光照着色器的渲染开销高于禁用阴影时的渲染开销。

  4. 实现详细信息
    如果对象的着色器不支持延迟着色,则会在延迟着色结束后使用前向渲染路径来渲染这些对象。

    下面列出了几何缓冲区(G 缓冲区)中渲染目标 (RT0 - RT4) 的默认布局。数据类型放置在每个渲染目标的各个通道中。使用的通道显示在括号内。

    RT0,ARGB32 格式:漫射颜色 (RGB),遮挡 (A)。
    RT1,ARGB32 格式:镜面反射颜色 (RGB),粗糙度 (A)。
    RT2,ARGB2101010 格式:世界空间法线 (RGB),未使用 (A)。
    RT3,ARGB2101010(非 HDR)或 ARGBHalf (HDR) 格式:发射 + 光照 + 光照贴图 + 反射探针缓冲区。
    深度+模板缓冲区。
    因此,默认的 G 缓冲区布局为 160 位/像素(非 HDR)或 192 位/像素 (HDR)。

    如果混合光照模式为 Shadowmask 或 Distance Shadowmask,则使用第五个目标:

    *RT4,ARGB32 格式:光照遮挡值 (RGBA)。

    因此,G 缓冲区布局为 192 位/像素(非 HDR)或 224 位/像素 (HDR)。

    如果硬件不支持五个并发渲染目标,则使用阴影遮罩的对象将回退到前向渲染路径。 当摄像机不使用 HDR 时,发射+光照缓冲区 (RT3) 采用对数编码,因此提供的动态范围高于 ARGB32 纹理通常可能提供的范围。

    请注意,当摄像机使用 HDR 渲染时,不会为发射 + 光照缓冲区 (RT3) 创建单独的渲染目标;而是将摄像机渲染到的渲染目标(即传递给图像效果的渲染目标)用作 RT3。

  5. G 缓冲区通道
    G 缓冲区通道将每个游戏对象渲染一次。漫射和镜面反射颜色、表面平滑度、世界空间法线和发射+环境+反射+光照贴图都将渲染到 G 缓冲区纹理中。G 缓冲区纹理设置为全局着色器属性供着色器以后访问 (CameraGBufferTexture0 …CameraGBufferTexture3 names)。

  6. 光照通道
    光照通道根据 G 缓冲区和深度来计算光照。光照是在屏幕空间内计算的,因此处理所需的时间与场景复杂性无关。光照将添加到发射缓冲区。

    不与摄像机近平面相交的点光源和聚光灯将渲染为 3D 形状,并会启用 Z 缓冲区对场景的测试。因此,部分或完全遮挡的点光源和聚光灯的渲染成本很低。方向光以及与近平面相交的点光源/聚光灯将渲染为全屏四边形。

    如果光源启用了阴影,那么也会在此通道中渲染并应用阴影。请注意,阴影并非是“无成本”的;需要渲染阴影投射物,并且必须应用更复杂的光照着色器。

    唯一可用的光照模型是标准 (Standard) 光照模型。如果需要不同的模型,可修改光照通道着色器,方法是将内置着色器中的 Internal-DeferredShading.shader 文件的修改版本放入“Assets”文件夹中名为“Resources”的文件夹内。然后打开 Graphics 设置(菜单:Edit > Project Settings,然后单击 Graphics 类别)。将“Deferred”下拉选单改为“Custom Shader”。然后,更改当前使用的着色器对应的着色器 (Shader) 选项。

使用命令缓冲区来扩展内置渲染管线

命令缓冲区可保存一组渲染命令。您可以指示 Unity 调度和执行这些命令。

在内置渲染管线中,可以在渲染循环中的特定时间执行命令缓冲区。为此,请将 Camera.AddCommandBuffer API 与 CameraEvent 枚举一起使用,并将 Light.AddCommandBuffer API 与 LightEvent 枚举一起使用。

例如,可以将命令缓冲区与 AfterGBuffer CameraEvent 结合使用,从而将其他游戏对象渲染到延迟管线中(在管线处理所有不透明的游戏对象之后)。

详见官方文档:https://docs.unity3d.com/cn/2020.1/Manual/GraphicsCommandBuffers.html

通用渲染管线

通用渲染管线 (Universal Render Pipeline, URP) 是由 Unity 制作的预构建可编程渲染管线 (Scriptable Render Pipeline),URP 提供了对美术师友好的工作流程,可让您在移动平台、高端游戏主机和 PC 等各种平台上快速轻松地创建优化的图形。

高清渲染管线

高清渲染管线 (HDRP) 是由 Unity 预先构建的可编程渲染管线。借助 HDRP 可以为高端平台创建出色的高保真图形。
HDRP 可以用于 AAA 级高品质游戏、汽车演示、建筑应用以及任何需要高保真图形的应用。HDRP 使用基于物理的光照和材质,并且支持前向渲染和延迟渲染。HDRP 使用计算着色器技术,因此需要兼容的 GPU 硬件。

可编程渲染管线

官方文档讲的不是很通俗,这里参考知乎上三位的专栏。虽然没写完,但看完对SRP有全面的认识
https://www.zhihu.com/people/jx-master/posts

https://www.zhihu.com/people/lucifer-3-91/posts

https://www.zhihu.com/people/li-ri-fu-99/posts?page=2

关于可编程渲染管线,后面可能会开个专栏具体来说,大家有什么好的系统的学习资料也可以丢过来

你可能感兴趣的:(Unity-手册,unity)