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

将信息传递到 HLSL 中的着色器编译器

在 HLSL 中,可以使用以下类型的预处理器指令向着色器在 GPU 上运行的程序。更多信息
请参阅术语表
编译器:

  • #pragma
  • #define_for_platform_compiler

编译指示

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

你可以把#pragma指令,但将它们放在开头是一种常见的约定,如下所示:

#pragma target 3.0
#pragma exclude_renderers vulkan
#pragma vertex vert
#pragma fragment frag

// The rest of your HLSL code goes here

局限性

使用有一些限制#pragma指令:

  • 您可以使用#pragma条件 (#if) 指令,如果表达式仅依赖于:
    • 任何自定义#define您自己的代码中的指令
    • 以下平台关键词:SHADER_API_MOBILE,SHADER_API_DESKTOP,UNITY_NO_RGBM,UNITY_USE_NATIVE_HDR,UNITY_FRAMEBUFFER_FETCH_AVAILABLE,UNITY_NO_CUBEMAP_ARRAY
    • UNITY_VERSION
  • 只能使用 Unity 特定的#pragma指令中的.shader文件,并在您包含在#include_with_pragmas命令。Unity 在包含在#include命令;编译器忽略它们。
  • 只能使用标准 HLSL#pragma指令包含在#include命令。Unity 不支持.shader文件,或包含在#include_with_pragmas命令;编译器忽略它们。

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

使用 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 编写着色器