版本:Unity 6 (6000.0)
语言:英语
在着色器中包含另一个 HLSL 文件
为不同的图形 API 编写着色器

在 HLSL 中向着色器编译器传递信息

在 HLSL 中,可以使用以下类型的预处理器指令来向 着色器在 GPU 上运行的程序。 更多信息
参见 词汇表
编译器提供信息

  • #pragma
  • #define_for_platform_compiler

Pragma 指令

#pragma 指令向着色器编译器提供其他类型的预处理器指令未涵盖的附加信息。

您可以在 HLSL 代码中的任何位置放置 #pragma 指令,但通常习惯将其放在开头,如下所示

#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_MOBILESHADER_API_DESKTOPUNITY_NO_RGBMUNITY_USE_NATIVE_HDRUNITY_FRAMEBUFFER_FETCH_AVAILABLEUNITY_NO_CUBEMAP_ARRAY
    • UNITY_VERSION
  • 您只能在 .shader 文件以及使用 #include_with_pragmas 指令包含的文件中使用 Unity 特定的 #pragma 指令。Unity 不支持在使用 #include 指令包含的文件中使用它们;编译器会忽略它们。
  • 您只能在使用 #include 指令包含的文件中使用标准 HLSL #pragma 指令。Unity 不支持在 .shader 文件中或使用 #include_with_pragmas 指令包含的文件中使用它们;编译器会忽略它们。

注意:如果着色器文件使用 #include 导入包含 #include_with_pragmas 指令的文件,Unity 将忽略 #include_with_pragmas 指令引用的文件中的 #pragma 指令。

使用 define_for_platform_compiler 指令

在着色器代码中使用 #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) 语句内添加着色器代码,则该代码将不会运行。

其他资源

在着色器中包含另一个 HLSL 文件
为不同的图形 API 编写着色器