GPU 默认使用 32 位精度。您可以在 GPU 计算中改用 16 位精度,这对移动平台而言有以下好处:
要在着色器中使用 16 位精度,请在声明标量、矢量或矩阵时使用 half。例如:
half _Glossiness;
half4 _Color;
half4x4 _Matrix;
要在纹理采样器中使用 16 位精度,请在声明时添加 _half。例如:
Texture2D<half4> _MainTex;
16 位精度对某些着色器计算而言可能不够。这可能会导致可见的错误,例如色带或不规则的几何体。要检查错误,请使用支持 half 的平台运行项目。如果存在错误,请改用 float。
half 变量会被存储在大小和对齐为 32 位的缓冲区中。
默认情况下,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 支持)。例如:
min16float。mediump。RelaxedPrecision 浮点数。float,但 GPU 会使用 16 位值进行计算。要覆盖纹理的 着色器精度模式 (Shader Precision Model) 设置,请在声明纹理采样器时添加 _half。例如 Texture2D<half4> _MainTex。