版本:Unity 6 (6000.0)
语言:英语
Unity 中的 HLSL 数据类型
将输入顶点数据输入着色器

在着色器中使用 16 位精度

默认情况下,GPU 使用 32 位精度。您可以在 GPU 计算中使用 16 位精度,这在移动平台上具有以下优点:

  • 着色器在 GPU 上运行的程序。 更多信息
    参见 术语表
    使用更少的内存、带宽和功耗。
  • 计算速度更快。使用更少的位可以改善 GPU 如何分配寄存器。

创建 16 位变量

要在着色器中使用 16 位精度,在声明标量、向量或矩阵时使用 half。例如:

half _Glossiness;
half4 _Color;
half4x4 _Matrix;

要在纹理采样器中使用 16 位精度,在声明时添加 _half。例如:

Texture2D<half4> _MainTex;

对于某些着色器计算,16 位精度可能不够。这可能会导致可见的错误,例如颜色带状或几何体卡顿。要检查错误,请在支持 half 的平台上运行项目。如果有错误,请改用 float

half 变量以 32 位的大小和对齐方式存储在缓冲区中。

在更多平台上使用 16 位值

默认情况下,half 对 Unity 中更高性能的平台(例如使用 MacOS 的平台)没有影响。half 变量将变为 float,GPU 将使用 32 位值进行计算。

要在更多平台上使用 16 位精度,请转到 编辑 > 项目设置 > 播放器 并将 着色器精度模型 设置为 统一。然后,Unity 将在您的 HLSL 代码中将 half 处理为以下内容:

  • min16float 用于标量
  • float 用于纹理采样器

当 Unity 编译着色器时,min16float 将变为平台数据类型,允许 GPU 使用 16 位精度进行计算(如果支持)。例如:

  • 如果您使用 DirectX 11 或 12,变量将保留为 min16float
  • 如果您使用 OpenGL,变量将变为 mediump
  • 如果您使用 Vulkan,变量将变为 RelaxedPrecision 浮点数。
  • 如果您使用 Metal,变量将变为 float,但 GPU 将使用 16 位值进行计算。

要覆盖纹理的 着色器精度模型 设置,请在声明纹理采样器时添加 _half。例如 Texture2D<half4> _MainTex

其他资源

Unity 中的 HLSL 数据类型
将输入顶点数据输入着色器