Unity3D:HLSL 中的杂注指令
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
HLSL 中的杂注指令
在 HLSL 中,指令是一种预处理器指令。它们向着色器编译器提供其他类型的预处理器指令未涵盖的其他信息。#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
- 如果表达式仅依赖于以下条件 () 指令,则可以在条件 () 指令中使用指令:
#pragma#if
- 您自己的代码中的任何自定义指令
#define
- 以下平台关键字:、、、、、
SHADER_API_MOBILESHADER_API_DESKTOPUNITY_NO_RGBMUNITY_USE_NATIVE_HDRUNITY_FRAMEBUFFER_FETCH_AVAILABLEUNITY_NO_CUBEMAP_ARRAY
- 宏
UNITY_VERSION
- 您只能在文件以及随指令中包含的文件中使用 Unity 特定的指令。Unity 在指令中包含的文件中不支持它们;编译器忽略它们。
#pragma.shader#include_with_pragmas#include
- 只能在指令中包含的文件中使用标准 HLSL 指令。Unity 在文件或随指令中包含的文件中不支持它们;编译器忽略它们。
#pragma#include.shader#include_with_pragmas
支持的杂注指令列表
Unity 支持属于标准 HLSL 的所有指令,只要这些指令位于常规包含文件中即可。有关这些指令的详细信息,请参阅 HLSL 文档:杂注指令。#pragma
此外,Unity 还支持以下特定于 Unity 的指令:#pragma
表面着色器
如果要编写曲面着色器,请使用此指令告诉编译器将哪个函数用作曲面函数,并将数据传递给该函数。
语句 | 功能 |
---|---|
#pragma surface <surface function> <lighting model> <optional parameters> | 使用给定名称编译函数作为表面着色器,以便它适用于给定的照明模型。有关详细信息,请参阅表面着色器。 |
着色器阶段
如果要编写常规图形着色器,请使用这些指令告诉编译器要用于不同着色器阶段的函数。和指令是必需的,但其他阶段是可选的。#pragma vertex#pragma fragment
语句 | 功能 |
---|---|
#pragma vertex <name> | 使用给定名称编译函数作为顶点着色器。将<名称>替换为函数名称。此指令在常规图形着色器中是必需的。 |
#pragma fragment <name> | 使用给定名称编译函数作为片段着色器。将<名称>替换为函数名称。此指令在常规图形着色器中是必需的。 |
#pragma geometry <name> | 使用给定名称编译函数作为几何着色器。将<名称>替换为函数名称。此选项会自动打开;有关详细信息,请参阅在 HLSL 中面向着色器模型和 GPU 功能。 注: Metal 不支持几何着色器。 #pragma require geometry |
#pragma hull <name> | 使用给定名称编译函数作为 DirectX 11 船体着色器。将<名称>替换为函数名称。这会自动添加 ;有关详细信息,请参阅在 HLSL 中面向着色器模型和 GPU 功能。#pragma require tessellation |
#pragma domain <name> | 使用给定名称编译函数作为 DirectX 11 域着色器。将<名称>替换为函数名称。此选项会自动打开;有关详细信息,请参阅在 HLSL 中面向着色器模型和 GPU 功能。#pragma require tessellation |
着色器变体和关键字
使用这些指令告诉着色器编译器如何处理着色器变体和关键字。有关详细信息,请参阅在 HLSL 中声明和使用着色器关键字。
命令 | 描述 |
---|---|
#pragma multi_compile <keywords> | 声明关键字的集合。编译器包括生成中的所有关键字。 您可以使用后缀,例如 来设置其他选项。 有关详细信息和支持的后缀列表,请参阅在 HLSL 中声明和使用着色器关键字。 _local |
#pragma shader_feature <keywords> | 声明关键字的集合。编译器从生成中排除未使用的关键字。 您可以使用后缀,例如 来设置其他选项。 有关详细信息和支持的后缀列表,请参阅在 HLSL 中声明和使用着色器关键字。 _local |
#pragma hardware_tier_variants <values> | 仅内置渲染管线:在针对给定图形 API 进行编译时,为图形层添加关键字。有关详细信息,请参阅图形层。 |
#pragma skip_variants <list of keywords> | 去除指定的关键字。 |
GPU 要求和着色器模型支持
使用这些指令告知编译器着色器需要特定的 GPU 功能。
语句 | 功能 |
---|---|
#pragma target <value> | 此着色器程序兼容的最小着色器模型。将<值>替换为有效值。有关有效值的列表,请参阅着色器编译:在 HLSL 中面向着色器模型和 GPU 功能。 |
#pragma require <value> | 此着色器兼容的最低 GPU 功能。将<值>替换为有效值或用空格分隔的多个有效值。有关有效值的列表,请参阅着色器编译:在 HLSL 中面向着色器模型和 GPU 功能。 |
图形 API
使用这些指令指示 Unity 包含或排除给定图形 API 的代码。
语句 | 功能 |
---|---|
#pragma only_renderers <value> | 仅为给定的图形 API 编译此着色器程序。将<值>替换为以空格分隔的有效值列表。有关详细信息和有效值的列表,请参阅在 HLSL 中面向图形 API 和平台。 |
#pragma exclude_renderers <value> | 不要为给定的图形 API 编译此着色器程序。将<值>替换为以空格分隔的有效值列表。有关详细信息和有效值的列表,请参阅在 HLSL 中面向图形 API 和平台。 |
其他 pragma 指令
语句 | 功能 |
---|---|
#pragma instancing_options <options> | 在此着色器中启用 GPU 实例化,并具有给定的选项。有关更多信息,请参阅 GPU 实例化 |
#pragma once | 将此指令放在文件中,以确保编译器在着色器程序中仅包含该文件一次。 注意:Unity 仅在启用缓存着色器预处理器时支持此指令。 |
#pragma enable_d3d11_debug_symbols | 为支持的图形 API 生成着色器调试符号,并禁用所有图形 API 的优化。使用它在外部工具中调试着色器代码。 Unity 为 Vulkan、DirectX 11 和 12 以及支持的控制台平台生成调试符号。 警告:使用此选项会导致文件大小增加和着色器性能降低。调试完着色器并准备好制作应用程序的最终版本后,请从着色器源代码中删除此行并重新编译着色器。 |
#pragma skip_optimizations <value> | 强制关闭给定图形 API 的优化。将<值>替换为以空格分隔的有效值列表。有关有效值的列表,请参阅 HLSL 中的图形 API 和平台目标 |
#pragma hlslcc_bytecode_disassembly | 将反汇编的 HLSLcc 字节码嵌入到转换的着色器中。 |
#pragma disable_fastmath | 启用涉及 NaN 处理的精确 IEEE 754 规则。 当前这仅影响 Metal 平台。 |
#pragma editor_sync_compilation | 强制进行同步编译。 这仅影响 Unity 编辑器。 有关更多信息,请参阅异步着色器编译。 |
#pragma enable_cbuffer | 使用 HLSLSupport 的 和 宏时,即使当前平台不支持常量缓冲区,也要发出 。CBUFFER_START(name) CBUFFER_END cbuffer(name) |
由3D建模学习工作室整理翻译,转载请注明出处!