デフォルトでは、GPU で 32 ビット精度が使用されます。GPU の計算には代わりに 16 ビット精度を使用できます。これにはモバイルプラットフォームで以下の利点があります。
シェーダーで 16 ビット精度を使用するには、スカラー、ベクトル、またはマトリックスを宣言するときに、half を使用します。
例:
half _Glossiness;
half4 _Color;
half4x4 _Matrix;
テクスチャサンプラーで 16 ビット精度を使用するには、宣言時に _half を追加します。
例:
Texture2D<half4> _MainTex;
シェーダー計算によっては、16 ビット精度では不十分な場合があります。それが原因で、カラーバンディングやスタッタージオメトリなど、目に見えるエラーが発生する可能性があります。エラーをチェックするには、half をサポートするプラットフォームでプロジェクトを実行します。エラーがある場合は、代わりに float を使用します。
half 変数は、32 ビットのサイズと整列でバッファに格納されます。
デフォルトでは、macOS を使用するプラットフォームなど、Unity の高パフォーマンスプラットフォームでは half は効果がありません。half 変数は float になり、GPU の計算には 32 ビット値が使用されます。
さまざまなプラットフォームで 16 ビット精度を使用するには、Edit > Project Settings > Player に移動して、Shader Precision Model を Uniform に設定します。これで、HLSL コードの half は以下のように扱われるようになります。
min16float
float
Unity がシェーダーをコンパイルするときには、min16float がプラットフォームのデータ型になり、16 ビット精度での計算をサポートしている GPU では、それが可能になります。
例:
min16float のまま変わりません。mediump になります。RelaxedPrecision Float になります。float になりますが、GPU の計算には 16 ビット値が使用されます。テクスチャの Shader Precision Model 設定をオーバーライドするには、テクスチャサンプラーを宣言するときに _half を追加します。例えば Texture2D<half4> _MainTex です。