Version: 2021.1
Shader compilation: pragma directives
Shader compilation: targeting graphics APIs

Shader compilation: targeting shader models and GPU features

In HLSL, shader models are a way of describing the capabilities of a GPU. You can tell Unity to compile shaders for GPUs with certain capabilities, either by specifying the shader model that the GPU must support, or by specifying individual features that the GPU must support.

For general information on shader models in HLSL, see the Microsoft documentation: Shader Models vs Shader Profiles .

Specifying a shader model or GPU feature

To specify a shader model or GPU feature that your Shader object requires, you use pragma directives in your HLSL code. You can indicate the shader model by using the #pragma target name directive, and you can indicate features using the #pragma require feature … directive.

例如:

# pragma target 3.5
# pragma require integers 2darray instancing

For more information on pragma directives, see HLSL pragma directives.

默认编译目标

默认情况下,Unity 将着色器编译为几乎支持的最低目标(“2.5”);处于 DirectX 着色器模型 2.0 和 3.0 之间。其他一些编译指令使着色器自动 编译成更高的目标:

  • 使用几何着色器 (#pragma geometry) 将编译目标设置为 4.0
  • 使用曲面细分着色器(#pragma hull#pragma domain)将编译目标设置为 4.6

对于几何体、外壳或域着色器,未通过 #pragma 显式设置函数入口点的任何着色器都将降级内部着色器功能要求。这可使具有更广泛运行时和功能差异的非 DX11 目标与现有着色器内容更加兼容。

例如,Unity 在 Metal 图形上支持曲面细分着色器,但 Metal 不支持几何着色器。使用 #pragma target 5.0 仍有效,只要您不使用几何着色器。

支持的“#pragma target”名称

以下是支持的着色器模型列表,其中包含大致增加的功能集(在某些情况下对于平台/GPU 的要求更高):

#pragma target 2.0

适用于 Unity 支持的所有平台。DX9 着色器模型 2.0。 有限数量的算术和纹理指令;8 个插值器;没有顶点纹理采样;片元着色器中没有衍生指令;没有显式的 LOD 纹理采样。

#pragma target 2.5(默认值)

  • 几乎与 3.0 目标相同(见下文),例外之处是仍然只有 8 个插值器,并且没有显式的 LOD 纹理采样。
  • 在 Windows Phone 上编译为 DX11 功能级别 9.3。

#pragma target 3.0

  • DX9 着色器模型 3.0:衍生指令,纹理 LOD 采样,10 个插值器,允许更多的数学/纹理指令。
  • 在 DX11 功能级别 9.x GPU(例如大多数 Windows Phone 设备)上不支持。
  • 某些 OpenGL ES 2.0 设备可能无法完全支持,具体取决于存在的驱动程序扩展和使用的功能。

#pragma target 3.5(或 es3.0)

  • OpenGL ES 3.0 功能(D3D 平台上的 DX10 SM4.0,只是没有几何着色器)。
  • 在 DX11 9.x (WinPhone) 和 OpenGL ES 2.0 上不支持。
  • 在 DX11+、OpenGL 3.2+、OpenGL ES 3+、Metal、Vulkan 和 PS4/XB1 游戏主机上支持。
  • 着色器、纹理数组等中的本机整数运算。

#pragma target 4.0

  • DX11 着色器模型 4.0。
  • 在 DX11 9.x (WinPhone)、OpenGL ES 2.0/3.0/3.1 和 Metal 上不支持。
  • 在 DX11+、OpenGL 3.2+、OpenGL ES 3.1+AEP、Vulkan 和 PS4/XB1 游戏主机上支持。
  • 具有几何着色器以及 es3.0 目标所具有的一切功能。

#pragma target 4.5(或 es3.1)

  • OpenGL ES 3.1 功能(D3D 平台上的 DX11 SM5.0,只是没有曲面细分着色器)。
  • 在早于 SM5.0 的 DX11、早于 4.3 的 OpenGL(即 Mac)和 OpenGL ES 2.0/3.0 上不支持。
  • 在 DX11+ SM5.0、OpenGL 4.3+、OpenGL ES 3.1、Metal、Vulkan 和 PS4/XB1 游戏主机上支持。
  • 有计算着色器、随机访问纹理写入、原子等。没有几何着色器和曲面细分着色器。

#pragma target 4.6(或 gl4.1)

  • OpenGL 4.1 功能(D3D 平台上的 DX11 SM5.0,只是没有计算着色器)。这基本上是 Mac 支持的最高 OpenGL 级别。
  • 在早于 SM5.0 的 DX11、早于 4.1 的 OpenGL、OpenGL ES 2.0/3.0/3.1 和 Metal 上不支持。
  • 在 DX11+ SM5.0、OpenGL 4.1+、OpenGL ES 3.1+AEP、Vulkan、Metal(不含几何体)和 PS4/XB1 游戏主机上支持。

#pragma target 5.0

  • DX11 着色器模型 5.0。
  • 在早于 SM5.0 的 DX11、早于 4.3 的 OpenGL(即 Mac)、OpenGL ES 2.0/3.0/3.1 和 Metal 上不支持。
  • 在 DX11+ SM5.0、OpenGL 4.3+、OpenGL ES 3.1+AEP、Vulkan、Metal(不含几何体)和 PS4/XB1 游戏主机上支持。

请注意,所有 OpenGL 类平台(包括移动平台)都被视为“支持着色器模型 3.0”。WP8/WinRT 平台(DX11 功能级别 9.x)被视为仅支持着色器模型 2.5。

支持的“#pragma require”名称

#pragma require 指令支持的功能名称列表:

  • interpolators10:至少有 10 个顶点到片元插值器(“变化”)可用。
  • interpolators15:至少有 15 个顶点到片元插值器(“变化”)可用。
  • interpolators32:至少有 32 个顶点到片元插值器(“变化”)可用。
  • mrt4:多个渲染目标,至少 4 个。
  • mrt8:多个渲染目标,至少 8 个。
  • derivatives:像素着色器衍生指令 (ddx/ddy)。
  • samplelod:显式纹理 LOD 采样 (tex2Dlod / SampleLevel)。
  • fragcoord:像素着色器中的像素位置(屏幕上的 XY,裁剪空间中的 ZW 深度)输入。
  • integers:整数是一种实际的数据类型,包括位/移位操作。
  • 2darray:2D 纹理数组 (Texture2DArray)。
  • cubearray:立方体贴图数组 (CubemapArray)。
  • instancing:SV_InstanceID 输入系统值。
  • geometry:DX10 几何着色器。
  • compute:计算着色器、结构化缓冲区、原子操作。
  • randomwrite:“随机写入”(UAV) 纹理。
  • tesshw:GPU 支持硬件曲面细分,但不一定是曲面细分着色器阶段(例如,Metal 支持曲面细分,但不是通过着色器阶段)。
  • tessellation:曲面细分外壳/域着色器阶段。
  • msaatex:能够访问多重采样的纹理(HLSL 中的 Texture2DMS)。
  • sparsetex:包含驻留信息的稀疏纹理(D3D 术语中的“Tier2”支持;CheckAccessFullyMapped HLSL 函数)。请注意,目前仅在 DX11/12 上实现。
  • framebufferfetch:帧缓冲提取 - 能够在像素着色器中读取输入像素颜色。

广泛的 #pragma target 指令是上述要求的缩写,它们对应于:

  • 2.5:derivatives
  • 3.0:2.5 + interpolators10 + samplelod + fragcoord
  • 3.5:3.0 + interpolators15 + mrt4 + integers + 2darray + instancing
  • 4.0:3.5 + geometry
  • 5.0:4.0 + compute + randomwrite + tesshw + tessellation
  • 4.5:3.5 + compute + randomwrite
  • 4.6:4.0 + cubearray + tesshw + tessellation

请注意,在 Direct3D 术语中,Shader Model 4.0 也表示“mrt8”;而 Shader Model 5.0 表示“interpolators32”和“cubearray”。但是,这些并不能保证在大量移动平台上都可用。因此,为了向后兼容现有着色器,编写 #pragma target 4.0 不会自动要求 8 个 MRT 支持;而编写 #pragma target 5.0 不需要 32 个插值器和立方体贴图数组。

另请参阅


  • 2018–03–20 页面已修订
  • 在 Unity 2018.1 中添加了着色器 #pragma 指令 NewIn20181
  • 在 2018.1 版中添加了__Metal 曲面细分__
Shader compilation: pragma directives
Shader compilation: targeting graphics APIs