默认情况下,GPU 使用 32 位精度。您可以在 GPU 计算中使用 16 位精度,这在移动平台上具有以下优点:
要在着色器中使用 16 位精度,在声明标量、向量或矩阵时使用 half
。例如:
half _Glossiness;
half4 _Color;
half4x4 _Matrix;
要在纹理采样器中使用 16 位精度,在声明时添加 _half
。例如:
Texture2D<half4> _MainTex;
对于某些着色器计算,16 位精度可能不够。这可能会导致可见的错误,例如颜色带状或几何体卡顿。要检查错误,请在支持 half
的平台上运行项目。如果有错误,请改用 float
。
half
变量以 32 位的大小和对齐方式存储在缓冲区中。
默认情况下,half
对 Unity 中更高性能的平台(例如使用 MacOS 的平台)没有影响。half
变量将变为 float
,GPU 将使用 32 位值进行计算。
要在更多平台上使用 16 位精度,请转到 编辑 > 项目设置 > 播放器 并将 着色器精度模型 设置为 统一。然后,Unity 将在您的 HLSL 代码中将 half
处理为以下内容:
min16float
用于标量float
用于纹理采样器当 Unity 编译着色器时,min16float
将变为平台数据类型,允许 GPU 使用 16 位精度进行计算(如果支持)。例如:
min16float
。mediump
。RelaxedPrecision
浮点数。float
,但 GPU 将使用 16 位值进行计算。要覆盖纹理的 着色器精度模型 设置,请在声明纹理采样器时添加 _half
。例如 Texture2D<half4> _MainTex
。