1、渲染管线简介

        渲染管线(Rendering Pipeline)其实就是GPU渲染流程。就是在一个三维坐标系下,基于一个视点,给定三维物体、光源以及照明模式、纹理等信息,如何绘制一幅呈现在视点画面中的二维图像的过程。

        Unity官方的简介是这样的:

        渲染管线执行一系列操作来获取场景的内容,并将这些内容显示在屏幕上。概括来说,这些操作如下:

  • 剔除
  • 渲染
  • 后期处理

2、渲染管线分类

        经过Unity的不断迭代,现在留下的是两套:Built-In Render(内置渲染管线)和SRP(Scriptable Render Pipeline,可编程渲染管线)。

        Built-In Render,兼容性较好,支持全平台,带来的弊端是效果并不是太好。

        SRP是可编程渲染管线技术,可用C#脚本定制Unity的渲染过程,但自己定制渲染管线对编程要求很高,难度大,所以Unity提供里2个预制的管线:通用渲染管线URP(Universal Render Pipeline)和高清渲染管线HDRP(High Definition Render Pipeline),基本上涵盖了我们所有的需求,使用时不需要太底层的技术要求。

unity改urp渲染管线 unity 渲染管线_渲染管线

 3、渲染管线对比

        只找到了如下的对比如,基于Unity2018.3的:

unity改urp渲染管线 unity 渲染管线_Unity_02

        接下来也主要针对这两种渲染管线做一些对比说明(关于图中的具体细节对比,后面再展开研究):

        URP(前身为Lightweight Render Pipeline --- LWRP轻量级渲染管线)专注于性能,偏向移动端和低端机器,它拥有很多HDRP相同的功能,但为了在所有平台达到更好的性能,其做了一定的缩减,但这并不意味着URP做不出漂亮的东西。

        HDRP专注于高端图形渲染,以画面为主 , 偏向高端机器和影视,但要想得到完成利用HDRP的完美表现能力,需要大量的贴图,漫反射贴图、高光贴图、金属贴图、平滑贴图、AO贴图、法线贴图、凹凸贴图、高度贴图,所以不是对效果有特别大需求的话慎入。

        两者最大的区别是对光照的支持,HDRP提供高级和丰富的光照功能,比如实时全局光照(RealTime GI),能够模拟光线反射、体积光、能模拟光穿过空气中的粒子,还有重头戏的光线跟踪,一种新的光线反射和阴影渲染技术,其原理是跟踪光线在场景中放射的路径,模拟光线在真实世界里与物体交互的效果,这技术对硬件性能非常高,但能产生非常逼真的效果,可以直接用来做电影级别的预渲染作品。

        另外一个区别是Shader,HDRP提供一系列高端的shader特效,例如高度、细节和parallax Maps,分别用于纹理的位移、细节和深度模拟,它还支持子面散射,用于模拟光线穿过很薄的物体,比如皮肤和衣物,它提供了高级的shader,像是stacklit,能够让你同时使用多个材质的属性,比如子面散射、彩虹色、各向异性和模糊参数化。

        对于后处理效果,两者不相伯仲,HDRP独占的最重要效果,包括AO(环境光遮蔽)、自动曝光(模拟人眼适应不同光线条件的能力)、屏幕空间反射(模拟基于屏幕上可见物体的反射)。URP的AO支持已经在做了,但好东西不是都在HDRP,2D光照和阴影就是URP独占的,所以如果你在做2D游戏,就选URP。

         另外两个管线都支持一个很Cool的特效---相机堆叠,让你能够同时用多个相机渲染。

4、渲染管线的资源创建(以URP为例)

        (1)导航到  Windows > Package Manager。

        (2)Packages选择Unity Registry。

        (3)找到Universal RP,Install。

        (4)Project面板,右键,Crate > Rendering > Universal Render Pipeline > Pipeline Asset (Forward Renderer)

5、切换渲染管线

5.1 激活内置渲染管线

        要将活动渲染管线设置为内置渲染管线,必须告知 Unity 我们未使用任何基于可编程渲染管线的渲染管线。当我们从项目设置中删除所有这些引用后,Unity 默认使用内置渲染管线。

        为此需要执行以下操作:

        (1)导航到 Edit > Project Settings > Quality,从而打开 Quality Settings 窗口。

        (2)对于每个质量级别,将 Render Pipeline 字段设置为 None

unity改urp渲染管线 unity 渲染管线_unity改urp渲染管线_03

        (3)导航到 Edit > Project Settings > Graphics,从而打开 Graphics Settings 窗口。

        (4)将 Scriptable Render Pipeline Setting 字段设置为 None

unity改urp渲染管线 unity 渲染管线_shader_04

5.2 激活基于 SRP 的 URP、HDRP 或自定义渲染管线

        要将活动渲染管线设置为基于 SRP 的渲染管线,我们必须告诉 Unity 要使用哪个渲染管线资源。渲染管线资源是一种资源,其中包含有关要使用的渲染管线以及如何配置该渲染管线的数据。

        我们可以拥有多个渲染管线资源,让 Unity 以不同配置使用同一渲染管线;例如,可能有一个适合高端硬件的设置,一个适合低端硬件的设置。

        在 Unity 编辑器中:

        (1)导航到 Edit > Project Settings > Graphics,从而打开 Graphics Settings 窗口。

        (2)在 Project 文件夹中,找到要使用的渲染管线的渲染管线资源。

        (3)将渲染管线资源拖放到 Scriptable Render Pipeline Setting 字段。这样定义了默认渲染管线,在给定质量级别没有覆盖值时,Unity 使用该管线。

        (4)可选,要为不同的质量级别使用不同的渲染管线资源:导航到 Edit > Project Settings > Quality 打开 Quality Settings 设置窗口。

        (5)可选,要为不同的质量级别使用不同的渲染管线资源:对于每个质量级别,将渲染管线资源拖放到 Render Pipeline 字段。

        在 C# 代码中:

         我们以使用 C#代码设置渲染管线资源。可以在 Unity 编辑器中以编辑模式或运行模式运行此代码,或者在构建的播放器中在运行时运行此代码。

        由于 SRP 是高度可配置的,因此更改活动的渲染管线资源可能会导致更改差异很大(例如从 URP 切换到 HDRP)。在运行时更改渲染管线资源的性能成本相应地有所不同。

        请注意,切换到新的渲染管线资源会使 Unity 销毁当前的渲染管线实例,并调用新渲染管线资源的 CreatePipeline() 方法。根据 SRP 中的代码,此操作可能在计算上是资源密集型操作。

        以下示例代码显示了如何设置存储在GraphicsSettings.renderPipelineAsset中的默认渲染管线资源。

        请注意,如果已在项目的 Quality Settings 为渲染管线资源指定了质量级别,则当前质量级别的渲染管线资源将覆盖默认渲染管线资源。可以如以下代码所示的方式在 C# 代码中使用 QualitySettings-renderPipeline API 进行更新。

using UnityEngine;
using UnityEngine.Rendering;
 
public class SwitchRenderPipelineAsset : MonoBehaviour
{
    public RenderPipelineAsset exampleAssetA;
    public RenderPipelineAsset exampleAssetB;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            GraphicsSettings.renderPipelineAsset = exampleAssetA;
            Debug.Log("Default render pipeline asset is: " + GraphicsSettings.renderPipelineAsset.name);
        }
        else if (Input.GetKeyDown(KeyCode.B))
        {
            GraphicsSettings.renderPipelineAsset = exampleAssetB;
            Debug.Log("Default render pipeline asset is: " + GraphicsSettings.renderPipelineAsset.name);
        }
    }
}