在 HLSL 中,可以使用以下类型的预处理器指令向着色器编译器提供信息:
#pragma#define_for_platform_compiler
#pragma 指令为着色器编译器提供了其他类型的预处理器指令未涵盖的额外信息。
可以将 #pragma 指令放置在 HLSL 代码中的任何位置,但通常会将它们放在开头,如下所示:
#pragma target 3.0
#pragma exclude_renderers vulkan
#pragma vertex vert
#pragma fragment frag
// The rest of your HLSL code goes here
#pragma 指令的使用存在一些限制:
#if) 指令中使用 #pragma 指令:
#define 指令SHADER_API_MOBILE、SHADER_API_DESKTOP、UNITY_NO_RGBM、UNITY_USE_NATIVE_HDR、UNITY_FRAMEBUFFER_FETCH_AVAILABLE、UNITY_NO_CUBEMAP_ARRAY
UNITY_VERSION 宏.shader 文件以及在 #include_with_pragmas 指令随附的文件中,才能使用特定于 Unity 的 #pragma 指令。在 #include 指令随附的文件中,它们不受 Unity 的支持;编译器会忽略它们。#include 指令随附的文件中使用标准 HLSL #pragma 指令。在 .shader 文件或者在 #include_with_pragmas 指令随附的文件中,它们不受 Unity 的支持;编译器会忽略它们。
注意:如果着色器文件使用 #include 导入包含 #include_with_pragmas 指令的文件,Unity 会忽略 #include_with_pragmas 指令引用的文件中的 #pragma 指令。
在着色器代码中使用 #define_for_platform_compiler 指令将 #define 指令发送到着色器编译器。
例如,#define_for_platform_compiler EXAMPLE_SYMBOL 会向着色器编译器发送 #define EXAMPLE_SYMBOL 指令,该指令定义了一个名为 EXAMPLE_SYMBOL 的符号。请参阅外部着色器编译器文档,例如 Microsoft 的 FXC 编译器文档,了解有关着色器编译器所用符号的更多信息。
Unity 预处理器不使用通过 #define_for_platform_compiler 定义的符号,因此无法在您自己的着色器代码中使用符号。例如,在上面的示例中,如果在 #if (EXAMPLE_SYMBOL) 语句中添加着色器代码,则代码将无法运行。