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 ビット値の使用

デフォルトでは、macOS を使用するプラットフォームなど、Unity の高パフォーマンスプラットフォームでは half は効果がありません。half 変数は float になり、GPU の計算には 32 ビット値が使用されます。

さまざまなプラットフォームで 16 ビット精度を使用するには、Edit > Project Settings > Player に移動して、Shader Precision ModelUniform に設定します。これで、HLSL コードの half は以下のように扱われるようになります。

  • スカラー場合は min16float
  • テクスチャサンプルの場合は float

Unity がシェーダーをコンパイルするときには、min16float がプラットフォームのデータ型になり、16 ビット精度での計算をサポートしている GPU では、それが可能になります。 例:

  • DirectX 11 または 12 を使用する場合、変数は min16float のまま変わりません。
  • OpenGL を使用する場合、変数は mediump になります。
  • Vulkan を使用する場合、変数は RelaxedPrecision Float になります。
  • Metal を使用する場合、変数は float になりますが、GPU の計算には 16 ビット値が使用されます。

テクスチャの Shader Precision Model 設定をオーバーライドするには、テクスチャサンプラーを宣言するときに _half を追加します。例えば Texture2D<half4> _MainTex です。

追加リソース

様々なグラフィックス API のシェーダーの作成
HLSL でシェーダーコンパイラーに情報を渡す
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961