HLSL の最小精度の使用

Windows 8以降、グラフィックス ドライバーは、指定したビット精度以上の精度を使用して、最小精度 HLSL スカラー データ型を実装できます。 HLSL 最小精度シェーダー コードが HLSL 最小精度を実装するハードウェアで使用されている場合は、使用するメモリ帯域幅が少なくなり、その結果、システム電力も少なくなります。

D3D11_FEATURE_SHADER_MIN_PRECISION_SUPPORT値を使用して ID3D11Device::CheckFeatureSupport を呼び出すことで、グラフィックス ドライバーが提供する最小精度サポートを照会できます。 詳細については、「 HLSL の最小精度のサポート」を参照してください。

最小有効桁数データ型を使用して変数を宣言する

HLSL シェーダー コードで最小精度を使用するには、 min16float (ベクターの場合は min16float4 )、 min16intmin10float などの型を持つ個々の変数を宣言します。 これらの変数を使用すると、シェーダー コードは、変数が示す精度よりも精度が必要ないことを示します。 ただし、ハードウェアは最小精度インジケーターを無視し、完全な 32 ビット精度で実行できます。 最小精度を利用するハードウェアでシェーダー コードを使用する場合は、使用するメモリ帯域幅が少なくなります。その結果、シェーダー コードが指定したよりも多くの精度を期待しない限り、システム電力も少なくなります。

最小精度を使用しない複数のシェーダーを作成する必要はありません。 代わりに、最小精度のシェーダーを作成し、グラフィックス ドライバーが最小精度をサポートしていないと報告した場合、最小精度変数は完全な 32 ビット精度で動作します。 HLSL 最小精度シェーダーは、Windows 8以前のオペレーティング システムでは機能しないため、以前のオペレーティング システムをターゲットにする場合は、複数のシェーダーを作成する必要があります。また、最小精度を使用しないシェーダーも作成する必要があります。

注意

これらの種類の変換は無駄であり、パフォーマンスが低下するため、シェーダー内のさまざまな精度レベル間でデータを切り替えないでください。 例外として、シェーダー定数は常に 32 ビットですが、ベンダーは、HLSL 命令の読み取りで使用できる低精度に自由にダウン変換できるグラフィックス ハードウェアを設計できます。

 

最小精度を使用すると、シェーダー コードのさまざまな部分で計算の精度を制御できます。

HLSL の最小有効桁数の規則は C/C++ に似ています。式の型は、最終的に書き込まれる型ではなく、操作の精度を決定します。

最小精度シェーダー コードのテスト

参照ラスタライザー (D3D_DRIVER_TYPE_REFERENCE) では、各 HLSL 命令を指定した精度に量子化することで、HLSL シェーダー コードの最小精度がどのように動作するかを大まかに把握できます。 これは、誤って最小精度以上に依存する可能性のあるコードを検出するのに役立ちます。 HLSL シェーダー コードで最小精度が使用されている場合、参照ラスタライザーの実行速度は向上しませんが、これを使用してコードの正確性を確認できます。 WARP (D3D_DRIVER_TYPE_WARP) では、HLSL シェーダー コードでの最小精度の使用はサポートされていません。WARP は、完全な 32 ビット精度で実行されます。

HLSL 用プログラミング ガイド