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