Unity 支持标准 HLSL 中的所有 #pragma 指令,只要这些指令位于常规 include 文件中即可。如需详细了解这些指令,请参阅 HLSL 文档:pragma 指令。
如果要编写 表面着色器,请使用此指令告诉编译器要使用的表面函数,并将数据传递给该函数。
| 语句 | 功能 |
|---|---|
#pragma surface <surface function> <lighting model> <optional parameters> |
编译具有给定名称的函数作为表面着色器,使其与给定光照模型配合使用。详情请参阅表面着色器。 |
如果要编写常规图形着色器,请使用下列指令告诉编译器不同着色器阶段所使用的函数。#pragma vertex 和 #pragma fragment 指令是必需的,但其他阶段是可选的。
| 语句 | 功能 |
|---|---|
#pragma vertex <name> |
将具有给定名称的函数编译为顶点着色器。将 <name> 替换为函数名称。常规图形着色器中需要此指令。 |
#pragma fragment <name> |
将具有给定名称的函数编译为片元着色器。将 <name> 替换为函数名称。常规图形着色器中需要此指令。 |
#pragma geometry <name> |
将具有给定名称的函数编译为几何体着色器。将 <name> 替换为函数名称。此选项会自动打开 #pragma require geometry;详情请参阅 使用 HLSL 定位着色器模型和 GPU 功能。注意:Metal 不支持几何体着色器。 |
#pragma hull <name> |
将具有给定名称的函数编译为 DirectX 11 外壳着色器。将 <name> 替换为函数名称。这会自动添加 #pragma require tessellation;详情请参阅 使用 HLSL 定位着色器模型和 GPU 功能。 |
#pragma domain <name> |
将具有给定名称的函数编译为 DirectX 11 域着色器。将 <name> 替换为函数名称。此选项会自动打开 #pragma require tessellation;详情请参阅 使用 HLSL 定位着色器模型和 GPU 功能。 |
使用下列指令告诉着色器编译器如何处理着色器变体和关键字。详情请参阅使用 HLSL 声明和使用着色器关键字。
| 指令 | 描述 |
|---|---|
#pragma multi_compile <keywords> |
声明一组关键字。编译器中包含了构建中的所有关键字。 您可以使用后缀(如 _local)设置其他选项。如需了解更多信息和支持的后缀列表,请参阅 使用 HLSL 声明和使用着色器关键字。 |
#pragma shader_feature <keywords> |
声明一组关键字。编译器会从构建中排除未使用的关键字。 您可以使用后缀(如 _local)设置其他选项。如需了解更多信息和支持的后缀列表,请参阅 使用 HLSL 声明和使用着色器关键字。 |
#pragma hardware_tier_variants <values> |
限内置渲染管线:在为给定图形 API 编译时,为图形层添加关键字。详情请参阅图形层。 |
#pragma skip_variants <list of keywords> |
剥离指定的关键字。 |
使用下列指令告诉编译器您的着色器要求特定的 GPU 功能。
| 语句 | 功能 |
|---|---|
#pragma target <value> |
此着色器程序兼容的最小着色器模型。将 <value> 替换为有效值。如需了解有效值的列表,请参阅着色器编译:使用 HLSL 定位着色器模型和 GPU 功能。 |
#pragma require <value> |
此着色器兼容的最小 GPU 功能。将 <value> 替换为有效值,或以空格分隔的多个有效值。如需了解有效值的列表,请参阅着色器编译:使用 HLSL 定位着色器模型和 GPU 功能。 |
使用下列指令让 Unity 针对图形 API 包含或排除给定的代码。
| 语句 | 功能 |
|---|---|
#pragma only_renderers <value> |
仅为给定的图形 API 编译此着色器程序。将 <values> 替换为以空格分隔的有效值列表。如需了解更多信息和有效值的列表,请参阅 使用 HLSL 定位图形 API 和平台。 例如, #pragma only_renderers glcore 仅针对桌面 OpenGL 进行编译。与 ES 3 目标一样,这也可扩展为包含所有桌面 OpenGL 版本,在这些版本中,基础着色器将支持 OpenGL 2.x,而需要着色器模型 5.0 功能的着色器则要求 OpenGL 4.2+。 |
#pragma exclude_renderers <value> |
不要为给定的图形 API 编译此着色器程序。将 <value> 替换为以空格分隔的有效值列表。如需了解更多信息和有效值的列表,请参阅 使用 HLSL 定位图形 API 和平台。 |
| 语句 | 功能 |
|---|---|
#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 强制关闭优化。将 <values> 替换为以空格分隔的有效值列表。如需了解有效值的列表,请参阅 使用 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)。 |