Version: Unity 6.0 (6000.0)
语言 : 中文
为不同的图形 API 编写着色器
在 HLSL 中将信息传递给着色器编译器

在着色器中使用 16 位精度

GPU 默认使用 32 位精度。您可以在 GPU 计算中改用 16 位精度,这对移动平台而言有以下好处:

  • 着色器会使用更少的内存、带宽和功耗。
  • 计算速度更快。使用更少的位数可以改善 GPU 分配寄存器的方式。

创建 16 位变量

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

half _Glossiness;
half4 _Color;
half4x4 _Matrix;

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

Texture2D<half4> _MainTex;

16 位精度对某些着色器计算而言可能不够。这可能会导致可见的错误,例如色带或不规则的几何体。要检查错误,请使用支持 half 的平台运行项目。如果存在错误,请改用 float

half 变量会被存储在大小和对齐为 32 位的缓冲区中。

在更多平台上使用 16 位值

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

要在更多平台上使用 16 位精度,请转到 编辑 (Edit) > 项目设置 (Project Settings) > 播放器 (Player),然后将 着色器精度等级 (Shader Precision Model) 设为 统一 (Uniform)。然后 Unity 就会按如下方式处理 HLSL 代码中的 half

  • 对标量使用 min16float
  • 对纹理采样器使用 float

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

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

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

其他资源

为不同的图形 API 编写着色器
在 HLSL 中将信息传递给着色器编译器
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961