Common-Shader Core
シェーダー モデル 4 では、すべてのシェーダー ステージが共通シェーダー コアを使用して同じ基本機能を実装します。 さらに、3 つのシェーダー ステージ (頂点、ジオメトリ、ピクセル) はそれぞれ、ジオメトリ シェーダー ステージから新しいプリミティブを生成したり、ピクセル シェーダー ステージ内の特定のピクセルを破棄したりする機能など、各ステージに固有の機能を提供します。 次の図は、データがシェーダー ステージを通過する方法と、共通シェーダー コアとシェーダー メモリ リソースの関係を示しています。
シェーダー ステージ図
- 入力データ: 頂点シェーダーは、入力アセンブラー ステージから入力を受け取ります。geometry シェーダーとピクセル シェーダーは、前のシェーダー ステージからの入力を受け取ります。 追加の入力には、システム値セマンティクスが含まれます。これは、適用可能なパイプラインの最初のユニットによって消費されます。
- 出力データ: シェーダーは出力結果を生成し、パイプラインの後続のステージに渡されます。 ジオメトリ シェーダーの場合、1 回の呼び出しからのデータ出力量は異なる場合があります。 一部の出力は、共通シェーダー コア (頂点位置や render-target-array インデックスなど) によって解釈され、他の出力はアプリケーションによって解釈されるように設計されています。
- シェーダー コード: シェーダーはメモリから読み取り、ベクター浮動小数点演算と整数演算、またはフロー制御操作を実行できます。 シェーダーに実装できるステートメントの数に制限はありません。
- サンプラー: サンプラーは、テクスチャをサンプリングおよびフィルター処理する方法を定義します。 シェーダーに同時にバインドできるサンプラーは 16 個までです。
- テクスチャ: テクスチャは、サンプラーを使用してフィルター処理することも、読み込み 組み込み関数を使用してテクセル単位で直接読み取ることもできます。
- バッファー: バッファーはフィルター処理されませんが、読み込み 組み込み関数を使用して、要素ごとにメモリから直接読み取ることができます。 128 個のテクスチャ リソースとバッファー リソース (結合) を同時にシェーダーにバインドできます。
- 定数バッファー: 定数バッファーはシェーダー定数変数用に最適化されています。 シェーダー ステージに同時にバインドできる定数バッファーは 16 個までです。 これらは、CPU からのより頻繁な更新のために設計されています。そのため、追加のサイズ、レイアウト、およびアクセス制限があります。
Direct3D 9 と Direct3D 10 の違い:
- Direct3D 9 では、各シェーダー ユニットには、すべての定数シェーダー変数を格納するための 1 つの小さな定数レジスタ ファイルがありました。 この限られた定数領域ですべてのシェーダーに対応する場合、CPU による定数の頻繁なリサイクルが必要でした。
- Direct3D 10 では、定数はメモリ内の不変バッファーに格納され、他のリソースと同様に管理されます。 アプリケーションで作成できる定数バッファーの数に制限はありません。 更新の頻度と使用頻度によって定数をバッファーに編成することで、すべてのシェーダーに対応するために定数を更新するために必要な帯域幅の量を大幅に削減できます。
整数とビットごとのサポート
共通シェーダー コアは、IEEE に準拠した 32 ビット整数とビットごとの演算の完全なセットを提供します。 これらの操作により、圧縮とパッキングの手法、FFT、ビットフィールド プログラム フロー制御など、グラフィックス ハードウェアの例で新しいクラスのアルゴリズムが有効になります。
Direct3D 10 HLSL の int と uint データ型は、ハードウェアの 32 ビット整数にマップされます。
Direct3D 9 と Direct3D 10 の違い: Direct3D 9 では、HLSL で整数としてマークされたストリーム入力は浮動小数点として解釈されました。 Direct3D 10 では、整数としてマークされたストリーム入力は 32 ビット整数として解釈されます。 さらに、ブール値は、すべてのビットセットまたはすべてのビットが未設定になりました。 ブール に変換されたデータは、値が 0.0f に等しくない場合は true として解釈されます (正と負の両方のゼロは false にできます)。それ以外の場合は false と解釈されます。 |
ビット演算子
一般的なシェーダー コアでは、次のビット演算子がサポートされています。
演算子 | 機能 |
---|---|
~ | 論理 Not |
<< | 左シフト |
>> | 右シフト |
& | 論理および |
| | 論理または |
^ | 論理 Xor |
<<= | 左シフトが等しい |
>>= | 右シフト (等号) |
&= | 等しい |
|= | または等しい |
^= | Xor Equal |
ビットごとの演算子は、int でのみ動作し、uint データ型を するように定義されています。 float またはデータ型 構造体 ビット演算子を使用しようとすると、エラーが発生します。 ビット演算子は、他の演算子に関して C と同じ優先順位に従います。
バイナリ キャスト
整数と浮動小数点型の間でキャストすると、C の切り捨て規則に従って数値が変換されます。 floatから intに値をキャストし、float に戻す方法は、ターゲット データ型の精度に依存する損失の大きい変換です。 変換関数の一部を次に示します。asfloat (DirectX HLSL)、asint (DirectX HLSL)、asuint (DirectX HLSL)。
バイナリ キャストは、HLSL 組み込み関数を使用して実行することもできます。 これにより、コンパイラは数値のビット表現をターゲット データ型に再解釈します。