版本:Unity 6 (6000.0)
语言:English
设置着色器以需要图形 API 或平台
设置着色器以需要包

设置着色器以需要着色器模型或 GPU 功能

您可以使用 #pragma 指令 指示 着色器在 GPU 上运行的程序。 更多信息
参见 术语表
需要某些 GPU 功能。在运行时,Unity 使用此信息来确定着色器程序是否与当前硬件兼容。

您可以使用 #pragma require 指令指定单个 GPU 功能,或使用 #pragma target 指令指定着色器模型。着色器模型是 GPU 功能组的简写;在内部,它与具有相同功能列表的 #pragma require 指令相同。

正确描述着色器所需的 GPU 功能非常重要。如果您的着色器使用了未包含在需求列表中的功能,则可能会导致编译时错误,或设备在运行时无法支持着色器。

默认行为

默认情况下,Unity 使用 #pragma require derivatives 编译着色器,这对应于 #pragma target 2.5

着色器阶段的特殊需求

如果您的着色器定义了某些着色器阶段,Unity 会自动将项目添加到需求列表中。

  • 如果着色器定义了几何体阶段(使用 #pragma geometry),Unity 会自动将 geometry 添加到需求列表中。
  • 如果着色器定义了细分阶段(使用 #pragma hull#pragma domain),Unity 会自动将 tessellation 添加到需求列表中。

如果需求列表(或等效的目标值)中尚未包含这些值,则 Unity 在编译着色器时会显示警告消息,以指示它已添加这些需求。要避免看到此警告消息,请在代码中显式添加需求或使用适当的目标值。

指定 GPU 功能或着色器模型

要指定所需的功能,请使用 #pragma require 指令,后跟以空格分隔的值列表。例如

#pragma require integers mrt8

您还可以使用 #pragma require 指令,后跟冒号和以空格分隔的 着色器关键字 列表。这意味着该需求仅适用于启用任何给定关键字时使用的变体。

例如

#pragma require integers mrt8 : EXAMPLE_KEYWORD OTHER_EXAMPLE_KEYWORD

您可以使用多行 #pragma require。在此示例中,着色器在所有情况下都需要 integers,如果启用了 EXAMPLE_KEYWORD,则需要 mrt8

#pragma require integers
#pragma require integers mrt8 : EXAMPLE_KEYWORD

要指定着色器模型,请使用 #pragma target 指令。例如

#pragma target 4.0

您还可以使用 #pragma target 指令,后跟以空格分隔的 着色器关键字 列表。这意味着该需求仅适用于启用任何给定关键字时使用的变体。

例如

#pragma target 4.0 EXAMPLE_KEYWORD OTHER_EXAMPLE_KEYWORD

注意:#pragma require#pragma target 指定关键字的语法略有不同。为 #pragma require 指定关键字时,使用冒号。为 #pragma target 指定关键字时,不使用冒号。

DirectX12 (DX12)、Vulkan 和 Metal 图形 API 功能

注意:如果您使用以下着色器关键字,Unity 将使用 DXC 编译器编译着色器。Unity 中的 DXC 支持处于实验阶段,并非所有平台都支持,并且尚未准备好用于生产。

如果您使用 DirectX12 (DX12)、Vulkan 或 Metal 图形 API,则可以使用着色器关键字来定位以下 GPU 功能

使用以下语法

#pragma multi_compile _ <keyword>

您不需要添加 pragma require 指令。

然后 Unity 执行以下操作

  • 使用兼容的着色器编译器并打开与功能相关的编译器标志。
  • 自动编译启用和禁用关键字的着色器变体。
  • 在运行时,自动检查硬件是否支持该功能并选择正确的变体。

您可以使用 #if 语句使着色器代码的一部分有条件地取决于 GPU 是否支持该功能。

关键字

多编译关键字 GPU 功能 用于条件着色器代码的关键字
UNITY_DEVICE_SUPPORTS_NATIVE_16BIT 支持 16 位数据类型。如果您使用此关键字,着色器缓冲区的布局可能会发生变化,因为 halfmin16float 等数据类型会转换为 16 位。 UNITY_DEVICE_SUPPORTS_NATIVE_16BIT
UNITY_DEVICE_SUPPORTS_WAVE_ANY 支持任何大小的波操作。仅当您使用波操作且波的大小无关紧要时,才使用此关键字。 UNITY_HW_SUPPORTS_WAVE
UNITY_DEVICE_SUPPORTS_WAVE_8 支持波大小为 8 的波操作。 UNITY_HW_SUPPORTS_WAVE
UNITY_DEVICE_SUPPORTS_WAVE_16 支持波大小为 16 的波操作。 UNITY_HW_SUPPORTS_WAVE
UNITY_DEVICE_SUPPORTS_WAVE_32 支持波大小为 32 的波操作。 UNITY_HW_SUPPORTS_WAVE
UNITY_DEVICE_SUPPORTS_WAVE_64 支持波大小为 64 的波操作。 UNITY_HW_SUPPORTS_WAVE
UNITY_DEVICE_SUPPORTS_WAVE_128 支持波大小为 128 的波操作。 UNITY_HW_SUPPORTS_WAVE

如果您使用定位特定波大小的关键字,Unity 会将 UNITY_HW_WAVE_SIZE 定义设置为相同的波大小,以便您可以在着色器代码中使用它。

有关更多信息,请参阅 在 HLSL 中声明和使用着色器关键字

其他资源

设置着色器以需要图形 API 或平台
设置着色器以需要包