您可以使用 #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 在编译着色器时会显示警告消息,以指示它已添加这些需求。要避免看到此警告消息,请在代码中显式添加需求或使用适当的目标值。
要指定所需的功能,请使用 #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
指定关键字时,不使用冒号。
注意:如果您使用以下着色器关键字,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 位数据类型。如果您使用此关键字,着色器缓冲区的布局可能会发生变化,因为 half 和 min16float 等数据类型会转换为 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 中声明和使用着色器关键字。