Unity3D:如何获取、设置和配置活动渲染管线

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

如何获取、设置和配置活动渲染管线

本页包含有关如何获取、设置和配置 Unity 当前使用的渲染管线的信息。Unity 当前使用的渲染管线称为活动渲染管线。

概述

要渲染内容,Unity 可以使用内置渲染管线或基于可编程渲染管线 (SRP) 的渲染管线,其中包括通用渲染管线 (URP) 和高清渲染管线 (HDRP)。

要指定 Unity 使用的可编程渲染管线,请使用渲染管线资源。渲染管线资源告诉 Unity 要使用哪个 SRP,以及如何配置它。如果未指定渲染管线资源,Unity 将使用内置渲染管线。

您可以创建多个使用相同渲染管线但配置不同的渲染管线资源;例如,您可以将不同的渲染管线资源用于不同的硬件质量级别。有关渲染管线资产的一般介绍,请参阅可编程渲染管线简介。有关 URP 渲染管线资源的信息,请参阅通用渲染管线资源,有关 HDRP 的渲染管线资源,请参阅高清渲染管线资源。

在 Unity 编辑器中或在运行时更改活动渲染管线后,Unity 将使用新的活动渲染管线来渲染内容。如果您使用的是 Unity 编辑器,则这包括“游戏”视图、“场景”视图以及“项目”面板和检查器中的材质预览。

更改活动渲染管线时,必须确保项目中的资产和代码与新的渲染管线兼容;否则,您可能会遇到错误或意外的视觉效果。

确定活动渲染管线

“图形设置”和“质量设置”中的设置决定了活动的渲染管线。在图形设置中,配置 Unity 默认使用的渲染管线。在“质量设置”中,可以覆盖给定质量级别的默认渲染管线。

若要获取或设置默认渲染管线,请使用图形设置>脚本化渲染管线设置(或其等效 API GraphicsSettings.defaultRenderPipeline)。若要获取或设置覆盖给定质量级别的默认值的渲染管线,请>“渲染管线”(或其等效 API,QualitySettings.renderPipeline)进行“质量设置”。

Unity 确定活动渲染管线,如下所示:

  • 如果渲染管线>当前质量设置级别引用渲染管线资源,Unity 将使用该值。
  • 否则:
  • 如果图形设置>可脚本化渲染管线设置引用渲染管线资源,Unity 将使用该值。
  • 否则,Unity 将使用内置渲染管线。

如何在编辑器 UI 中获取和设置活动渲染管线

获取活动渲染管线

要在编辑器 UI 中获取活动的渲染管线,必须同时检查“图形设置”和“质量设置”窗口。有关如何使用这些值确定活动渲染管线的信息,请参阅确定活动渲染管线。

激活内置渲染管线

要将活动渲染管线设置为内置渲染管线,请从图形设置和质量设置中删除任何渲染管线资源。

为此需要执行以下操作:

  1. 选择“编辑”>“项目设置”>“质量”。
  2. 对于每个质量级别,如果将渲染管线资源分配给渲染管线字段,请取消分配它。
  3. 选择编辑>项目设置>图形
  4. 如果渲染管线资源已分配给“可编程渲染管线设置”字段,请取消分配它。

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

要将活动渲染管线设置为基于 SRP 的渲染管线,请告知 Unity 将哪个渲染管线资源用作默认活动渲染管线,并选择性地将哪个渲染管线资源用于每个质量级别。

为此需要执行以下操作:

  1. 在项目文件夹中,找到要使用的渲染管线资源。
  2. 设置默认渲染管线,Unity 在给定质量级别没有覆盖时使用该管线。如果未进行此设置,Unity 将在不应用覆盖时使用内置渲染管线。
  3. 选择编辑>项目设置>图形
  4. 将渲染管线资源拖到可编程渲染管线设置字段。
  5. 可选:为不同的质量级别设置覆盖渲染管线资源。
  6. 选择“编辑”>“项目设置”>“质量”。
  7. 将渲染管线资源拖到渲染管线字段。

如何在 C# 脚本中获取和设置活动渲染管线

在 C# 脚本中,可以获取和设置活动渲染管线,并在活动呈现管线更改时接收回调。您可以在 Unity 编辑器的编辑模式或运行模式下执行此操作,也可以在运行时在应用程序中执行此操作。

要执行此操作,请使用以下 API:

  • 有几种方法可以获取活动渲染管线:
  • 若要获取对定义活动渲染管线的渲染管线资源的引用,请使用 GraphicsSettings.currentRenderPipeline。
  • 要获取对定义活动渲染管线的渲染管线资源的引用,并确定 Unity 使用的是默认值还是覆盖值,请获取 GraphicsSettings.defaultRenderPipeline 和 QualitySettings.renderPipeline 的值。有关如何使用这些值的信息,请参阅确定活动渲染管线或以下代码示例。
  • 若要获取活动渲染管线的 RenderPipeline 实例,请使用 RenderPipelineManager.currentPipeline。注意:Unity 仅在使用活动渲染管线渲染至少一帧后更新此属性。
  • 要设置活动渲染管线,请设置 GraphicsSettings.defaultRenderPipeline 和 QualitySettings.renderPipeline 的值。有关如何使用这些值的信息,请参阅确定活动渲染管线或以下代码示例。
  • 若要在活动渲染管线的类型更改时检测并执行代码,请使用 RenderPipelineManager.activeRenderPipelineTypeChanged。

以下示例代码演示如何使用这些 API:

using UnityEngine;
using UnityEngine.Rendering;
 
public class ActiveRenderPipelineExample : MonoBehaviour
{
    // In the Inspector, assign a Render Pipeline Asset to each of these fields
    public RenderPipelineAsset defaultRenderPipelineAsset;
    public RenderPipelineAsset overrideRenderPipelineAsset;
 
    void Start()
    {
        GraphicsSettings.defaultRenderPipeline = defaultRenderPipelineAsset;
        QualitySettings.renderPipeline = overrideRenderPipelineAsset;

        DisplayCurrentRenderPipeline();
    }

    void Update()
    {
        // When the user presses the left shift key, switch the default render pipeline
        if (Input.GetKeyDown(KeyCode.LeftShift)) {
            SwitchDefaultRenderPipeline();
            DisplayCurrentRenderPipeline();
        }
        // When the user presses the right shift key, switch the override render pipeline
        else if (Input.GetKeyDown(KeyCode.RightShift)) {
            SwitchOverrideRenderPipeline();
            DisplayCurrentRenderPipeline();
        }
    }

    // Switch the default render pipeline between null,
    // and the render pipeline defined in defaultRenderPipelineAsset
    void SwitchDefaultRenderPipeline()
    {
        if (GraphicsSettings.defaultRenderPipeline == defaultRenderPipelineAsset)
        {
            GraphicsSettings.defaultRenderPipeline = null;
        }
        else
        {
            GraphicsSettings.defaultRenderPipeline = defaultRenderPipelineAsset;
        }
    }

    // Switch the override render pipeline between null,
    // and the render pipeline defined in overrideRenderPipelineAsset
    void SwitchOverrideRenderPipeline()
    {
        if (QualitySettings.renderPipeline == overrideRenderPipelineAsset)
        {
            QualitySettings.renderPipeline = null;
        }
        else
        {
           QualitySettings.renderPipeline = overrideRenderPipelineAsset;
        }
    }

    // Print the current render pipeline information to the console
    void DisplayCurrentRenderPipeline()
    {
        // GraphicsSettings.defaultRenderPipeline determines the default render pipeline
        // If it is null, the default is the Built-in Render Pipeline
        if (GraphicsSettings.defaultRenderPipeline != null)
        {
            Debug.Log("The default render pipeline is defined by " + GraphicsSettings.defaultRenderPipeline.name);
        }
        else
        {
            Debug.Log("The default render pipeline is the Built-in Render Pipeline");
        }

        // QualitySettings.renderPipeline determines the override render pipeline for the current quality level
        // If it is null, no override exists for the current quality level
        if (QualitySettings.renderPipeline != null)
        {
            Debug.Log("The override render pipeline for the current quality level is defined by " + QualitySettings.renderPipeline.name);
        }
        else
        {
            Debug.Log("No override render pipeline exists for the current quality level");
        }

        // If an override render pipeline is defined, Unity uses that
        // Otherwise, it falls back to the default value
        if (QualitySettings.renderPipeline != null)
        {
            Debug.Log("The active render pipeline is the override render pipeline");
        }
        else
        {
            Debug.Log("The active render pipeline is the default render pipeline");
        }

        // To get a reference to the Render Pipeline Asset that defines the active render pipeline,
        // without knowing if it is the default or an override, use GraphicsSettings.currentRenderPipeline
        if (GraphicsSettings.currentRenderPipeline != null)
        {
            Debug.Log("The active render pipeline is defined by " +GraphicsSettings.currentRenderPipeline.name);
        }
        else
        {
            Debug.Log("The active render pipeline is the Built-in Render Pipeline");
        }
    }
}

此文由3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D:Render pipeline feature comparison (mvrlink.com)

下一篇:Unity3D:选择和配置渲染管线和光照解决方案 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号