HLSL の最小精度の使用
Windows 8 以降では、グラフィックス ドライバーは、指定されたビット精度以上の精度を使用して、HLSL スカラー データ型 最小精度を実装できます。 HLSL 最小精度シェーダー コードが HLSL 最小精度を実装するハードウェアで使用されている場合は、使用するメモリ帯域幅が少なくなり、その結果、使用するシステム電力も少なくなります。
グラフィックス ドライバーが提供する最小精度サポートを照会する場合は、ID3D11Device::CheckFeatureSupport を D3D11_FEATURE_SHADER_MIN_PRECISION_SUPPORT 値で呼び出します。 詳しくは、HLSL 最小精度サポート を参照してください。
最小限の精度を持つデータ型を使用して変数を宣言する
HLSL シェーダー コードで最小精度を使用するには、min16float (ベクターの場合はmin16float4)、min16int 、min10floatなどの型を持つ個々の変数を宣言します。 これらの変数を使用すると、シェーダー コードは、変数が示す精度よりも高い精度を必要としないことを示します。 ただし、ハードウェアは最小有効桁数インジケーターを無視し、完全な 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 の プログラミング ガイド