帧设置脚本 API
在高清渲染管线 (High Definition Render Pipeline, HDRP) 中,帧设置 (Frame Settings) 可以控制渲染组件(例如摄像机、反射探针或平面反射探针)如何渲染场景。您可以为整个项目指定默认的帧设置,然后针对特定的渲染组件覆盖这些设置。这意味着每个帧设置都有一个默认值,即 HDRP 资源中设置的值,然后场景中的每个渲染组件都可以对该设置进行覆盖。如果您具有不需要使用某些效果且优先级较低的渲染组件,这将很有用。要指定渲染组件覆盖哪些默认的帧设置,每个渲染组件都包含一个覆盖遮罩。遮罩是位数组,其中每个位代表两种状态之一(0 表示禁用,1 表示启用)。覆盖遮罩中的每个位代表特定帧设置的覆盖状态。
要获取特定渲染组件的帧设置的最终值,HDRP 执行以下步骤:
- 检查帧设置的项目范围默认值。在此步骤中,HDRP 会检查在 HDRP 资源中为帧设置存储的当前值。
- 检查渲染组件的覆盖遮罩,以查看是否设置了与帧设置相对应的位。帧设置在覆盖遮罩中的位状态对应于渲染组件 Inspector 中帧设置左侧的覆盖复选框状态。
- 从渲染组件的自定义帧设置中获取帧设置的覆盖值。
- 对结果进行清理。为了简化项目,您可以指定要在 HDRP 资源中使用的功能。如果您尝试修改的帧设置会影响某个不可用的功能,则 Unity 会在此最终清理通道中将其丢弃。为确保 HDRP 无法处理不可用的功能,您无法通过脚本 API 访问清理过程。
修改默认帧设置
默认帧设置位于 HDRP 资源中,因此在运行时修改这些设置不是一个好习惯。正确的做法是在 Default Settings 选项卡中以编辑模式修改这些设置。
请注意,您可以为三种类型的渲染组件设置单独的默认帧设置:
- 摄像机
- 实时反射探针和实时平面反射探针
- 烘焙/自定义反射探针和烘焙/自定义平面反射探针
当前没有脚本 API 可以修改默认帧设置。
修改特定渲染组件的帧设置
HDRP 将渲染组件的帧设置存储在附加到渲染组件的其他数据组件中。其他数据组件包括:
渲染组件 | 其他数据组件 |
---|---|
摄像机 | HDAdditionalCameraData |
反射探针 | HDAdditionalReflectionData |
要修改帧设置的值,第一步是获取对其他数据组件的引用。为此,请创建一个公共变量并在 Inspector 中分配该变量,或使用 GetComponent
接下来,访问帧设置覆盖遮罩。此遮罩可以控制要将覆盖的值用于哪些帧设置,并且类型为 FrameSettingsOverrideMask
。根据您是要修改摄像机的帧设置还是反射探针的帧设置,访问帧设置覆盖遮罩的方法会有所不同:
- 摄像机:
HDAdditionalCameraData.renderingPathCustomFrameSettingsOverrideMask
- 反射探针:
HDAdditionalReflectionData.frameSettingsOverrideMask
如需了解可用于 FrameSettingsOverrideMask
的 API,包括如何设置/取消设置遮罩中的某个位,请参阅 FrameSettingsOverrideMask 脚本 API。
最后,请访问帧设置结构本身。该结构控制每个帧设置的实际值,并且类型为 FrameSettings
。根据您是要修改摄像机的帧设置还是反射探针的帧设置,访问帧设置的方法也会有所不同:
- 摄像机:
HDAdditionalCameraData.renderingPathCustomFrameSettings
- 反射探针:
HDAdditionalReflectionData.frameSettings
如需了解可用于 FrameSettings
的 API,包括如何编辑帧设置的值,请参阅 FrameSettings 脚本 API。
帧设置枚举
为了更容易设置某些帧设置的值,HDRP 提供了以下枚举类型。
LitShaderMode
这个枚举有助于在延迟渲染和前向渲染之间切换渲染组件。
有关每个枚举值的作用的信息,请参阅 LitShaderMode。
LODBiasMode
这个枚举定义了 HDRP 如何计算 LOD 偏差。
有关每个枚举值的作用的信息,请参阅 LODBiasMode。
MaximumLODLevelMode
这个枚举定义了 HDRP 如何计算最大的 LOD 级别。
有关每个枚举值的作用的信息,请参阅 MaximumLODLevelMode。
FrameSettingsField
这个枚举中的每个条目代表一个特定帧设置。有关此枚举中的条目列表,请参阅 FrameSettingsField。
除了每个帧设置的条目外,此枚举还包括 FrameSettingsField.None
值,为方便起见和内部使用,此值设置为 -1。
FrameSettingsOverrideMask 脚本 API
这是一个结构,其中具有存储覆盖遮罩的字段。如需进一步了解此结构以及此结构包含的 API,请参阅 FrameSettingsOverrideMask。
在覆盖遮罩中,为了让您轻松访问给定帧设置的位,HDRP 提供了 FrameSettingsField 枚举。例如,您可以使用该枚举来查找负责覆盖 Opaque Objects 帧设置的位。为此,需要执行 this[(int)FrameSettingsField.OpaqueObjects]
。
下面的示例演示了如何将渲染组件的覆盖遮罩中的 humanizedData
与渲染组件的自定义帧设置进行比较。这里设置了一些自定义的帧设置,但是遮罩全为零,这意味着此渲染组件使用默认的帧设置。
FrameSettings 脚本 API
这是一个结构,其中包含有关渲染组件应如何渲染场景的信息。如需进一步了解此结构以及此结构包含的 API,请参阅 FrameSettings。
示例
下面的示例演示了一个组件,该组件会更改摄像机的帧设置,使摄像机不会渲染不透明的游戏对象。这个组件具有公共字段 cameraToChange
,这表示要更改帧设置的摄像机,还有公共函数 RemoveOpaqueObjectsFromRendering
,其中包含用于更改摄像机帧设置的逻辑。
using UnityEngine;
using UnityEngine.Rendering.HighDefinition;
public class ChangeFrameSettings : MonoBehaviour
{
public Camera cameraToChange;
public void RemoveOpaqueObjectsFromRendering()
{
HDAdditionalCameraData hdCameraData = cameraToChange.GetComponent<HDAdditionalCameraData>();
hdCameraData.renderingPathCustomFrameSettingsOverrideMask.mask[(int)FrameSettingsField.OpaqueObjects] = true;
hdCameraData.renderingPathCustomFrameSettings.SetEnabled(FrameSettingsField.OpaqueObjects, false);
}
}