Version: 6000.3
语言: 中文
将着色器设置为需要图形 API 或平台
将着色器设置为需要包

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

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

您可以使用#pragma require指令,或使用#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在所有情况下,以及mrt8如果启用了EXAMPLE_KEYWORD。

#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 是否支持该功能为条件。

关键字

multi-compile 关键字 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 或平台
将着色器设置为需要包