Unity3D:面向 HLSL 中的着色器模型和 GPU 功能
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
面向 HLSL 中的着色器模型和 GPU 功能
您可以使用#pragma
指令来指示着色器需要某些 GPU 功能。在运行时,Unity 使用此信息来确定着色器程序是否与当前硬件兼容。
您可以使用指令指定单个 GPU 功能,也可以使用指令指定着色器模型。着色器模型是一组 GPU 功能的简写;在内部,它与具有相同功能列表的指令相同。#pragma require#pragma target#pragma require
正确描述着色器所需的 GPU 功能非常重要。如果着色器使用未包含在要求列表中的功能,则可能导致编译时错误,或者设备在运行时无法支持着色器。
默认行为
默认情况下,Unity 使用 编译着色器,对应于 。#pragma require derivatives#pragma target 2.5
着色器阶段的特殊要求
如果您的着色器定义了某些着色器阶段,Unity 会自动将项目添加到需求列表中。
- 如果着色器定义了几何体阶段 (带),Unity 会自动添加到要求列表中。
#pragma geometrygeometry
- 如果着色器定义了细分阶段(带 或 ),Unity 会自动添加到要求列表中。
#pragma hull#pragma domaintessellation
如果要求列表(或等效目标值)尚未包含这些值,Unity 将在编译着色器时显示一条警告消息,指示它已添加这些要求。若要避免看到此警告消息,请在代码中显式添加要求或使用适当的目标值。
指定 GPU 功能或着色器模型
要指定所需的要素,请使用指令,后跟空格分隔值的列表。例如:#pragma require
#pragma require integers mrt8
还可以使用该指令,后跟冒号和空格分隔的着色器关键字列表。这意味着该要求仅适用于启用任何给定关键字时使用的变体。#pragma require
例如:
#pragma require integers mrt8 : EXAMPLE_KEYWORD OTHER_EXAMPLE_KEYWORD
您可以使用多行。在此示例中,着色器在所有情况下都需要,并且如果启用了EXAMPLE_KEYWORD。#pragma requireintegersmrt8
#pragma require integers
#pragma require integers mrt8 : EXAMPLE_KEYWORD
要指定着色器模型,请使用指令。例如:#pragma target
#pragma target 4.0
还可以使用该指令,后跟以空格分隔的着色器关键字列表。这意味着该要求仅适用于启用任何给定关键字时使用的变体。#pragma target
例如:
#pragma target 4.0 EXAMPLE_KEYWORD OTHER_EXAMPLE_KEYWORD
注意:用于指定 和 关键字的语法略有不同。为 指定关键字时,将使用冒号。为 指定关键字时,不使用冒号。#pragma require#pragma target#pragma require#pragma target
“#pragma目标”值列表
以下是 Unity 使用的着色器模型列表,以及每个模型对应的值组合。#pragma require
注意:Unity 的着色器模型类似于 DirectX 着色器模型和 OpenGL 版本要求,但它们并不完全对应。仔细阅读说明,以确保您了解差异。
值 | 描述 | 支持 | 等效#pragma需要 值 |
---|---|---|---|
2.0 | 等效于 DirectX 着色器模型 2.0。 有限数量的算术和纹理指令;8个插值器;无顶点纹理采样;片段着色器中没有衍生物;没有显式 LOD 纹理采样。 | 适用于 Unity 支持的所有平台。 | 无 |
2.5 | 与 3.0 几乎相同,但只有 8 个插值器,并且没有明确的 LOD 纹理采样。 | DirectX 11 功能级别 9+OpenGL 3.2+ OpenGL ES 2.0 Vulkan Metal | derivatives |
3.0 | 等效于 DirectX 着色器模型 3.0。 . | DirectX 11 功能级别 10 + OpenGL 3.2+ OpenGL ES 3.0+ Vulkan Metal 可能适用于某些 OpenGL ES 2.0 设备,具体取决于驱动程序扩展和功能。 | 中的所有内容,以及:2.5 interpolators10 samplelod fragcoord |
3.5 | 相当于 OpenGL ES 3.0。 | DirectX 11 功能级别 10+OpenGL 3.2+ OpenGL ES 3+ Vulkan Metal | 中的所有内容,以及:3.0 interpolators15 mrt4 integers 2darray instancing |
4.0 | 等效于 DirectX 着色器模型 4.0,但不需要支持 8 个 MRT。 | DirectX 11 功能级别 10+OpenGL 3.2+OpenGL ES 3.1+ AEP Vulkan Metal(如果未定义几何舞台) | 中的所有内容,以及:3.5 geometry |
4.5 | 相当于OpenGL ES 3.1。 | DirectX 11 功能级别 11+OpenGL 4.3+ OpenGL ES 3.1 Vulkan Metal | 中的所有内容,以及:3.5 compute randomwrite msaatex |
4.6 | 相当于 OpenGL 4.1。 这是 Mac 上支持的最高 OpenGL 级别。 | DirectX 11 功能级别 11+OpenGL 4.1+OpenGL ES 3.1+ AEP Vulkan Metal(如果未定义几何阶段,并且未定义船体或域阶段) | 中的所有内容,以及:4.0 cubearray tesshw tessellation msaatex |
5.0 | 等效于 DirectX 着色器模型 5.0,但不需要支持 32 个插值器或立方体贴图数组。 | DirectX 11 功能级别 11+OpenGL 4.3+OpenGL ES 3.1+ AEP Vulkan Metal(如果未定义几何阶段,并且未定义船体或域阶段) | 中的所有内容,以及:4.0 compute randomwrite msaatex tesshw tessellation |
有关控制台平台的着色器模型支持的信息,请参阅特定于平台的文档。
注意:
- 在 DirectX 定义中,着色器模型 4.0 包括 ,着色器模型 5.0 包括 和 。Unity 不包括这些,以实现更广泛的兼容性。若要要求这些功能,请使用显式指令。
mrt8interpolators32cubearray#pragma require
- 如果使用的目标需要,但着色器未定义几何体阶段,Unity 将在编译时从要求列表中删除。
geometrygeometry
- 如果使用需要的目标,但着色器未定义船体或域阶段,Unity 将在编译时从要求列表中删除。
tessellationtessellation
“#pragma要求”值列表
以下是该指令的所有有效值。#pragma require
值 | 描述 |
---|---|
interpolators10 | 至少有 10 个顶点到片段插值器(“变化”)可用。 |
interpolators15 | 至少有 15 个顶点到片段插值器(“变化”)可用。 注意:在内部,这也会自动添加到要求列表中。 integers |
interpolators32 | 至少有 32 个顶点到片段插值器(“变化”)可用。 |
integers | 整数是受支持的数据类型,包括位/移位操作。 注意:在内部,这也会自动添加到要求列表中。 interpolators15 |
mrt4 | 至少支持 4 个呈现目标。 |
mrt8 | 至少支持 8 个呈现目标。 |
derivatives | 支持像素着色器派生指令 (ddx/ddy)。 |
samplelod | 支持显式纹理LOD采样(tex2Dlod / SampleLevel)。 |
fragcoord | 支持像素着色器中的像素位置(屏幕上的 XY、剪辑空间中的 ZW 深度)输入。 |
2darray | 2D 纹理数组是受支持的数据类型。 |
cubearray | 立方体贴图数组是受支持的数据类型。 |
instancing | 支持SV_InstanceID输入系统值。 |
geometry | 支持几何着色器阶段。 |
compute | 支持计算着色器、结构化缓冲区和原子操作。 |
randomwrite 或uav | 支持“随机写入”(UAV) 纹理。 |
tesshw | 支持硬件细分,但不一定支持细分(船体/域)着色器阶段。例如,Metal 支持曲面细分,但不支持船体或域阶段。 |
tessellation | 支持细分(船体/域)着色器阶段。 |
msaatex | 支持访问多采样纹理(HLSL中的Texture2DMS)的功能。 |
sparsetex | 具有驻留信息的稀疏纹理(DirectX 术语中的“Tier2”支持; HLSL 函数)。CheckAccessFullyMapped |
framebufferfetch 或fbfetch | 支持帧缓冲提取(在像素着色器中读取输入像素颜色的功能)。 |
setrtarrayindexfromanyshader | 支持从任何着色器阶段(而不仅仅是几何着色器阶段)设置呈现器目标数组索引。 |
由3D建模学习工作室整理翻译,转载请注明出处!