Version: Unity 6.0 (6000.0)
语言 : 中文
将着色器设置为需要资源包
将着色器设置为需要图形 API 或平台

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

您可以使用 #pragma 指令来表示着色器需要特定的 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 或平台