Version: 6000.3
语言: 中文
Unity 中的 HLSL 数据类型
将顶点数据输入着色器

在着色器中使用 16 位精度

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

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

创建一个 16 位变量

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

half _Glossiness;
half4 _Color;
half4x4 _Matrix;

若要在纹理采样器中使用 16 位精度,请将half4当你声明它时。例如:

Texture2D<half4> _MainTex;

对于某些着色器计算,16 位精度可能不足。这可能会导致可见的错误,例如色带或卡顿几何体。要检查错误,请在支持half.如果有错误,请使用float相反。

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

在更多平台上使用 16 位值

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

要在更多平台上使用 16 位精度,请转到 编辑>项目设置(Project Settings) > 播放器,并将 着色器精度模型(Shader Precision Model) 设置为 均匀(Uniform)。然后 Unity 将half在 HLSL 代码中,如下所示:

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

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

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

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

其他资源

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