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
<< 左シフト
>> 右シフト
& 論理 AND
| 論理式 OR
^ 論理 Xor
<<= 左シフト等しい
>>= 右シフトが等しい
&= And Equal
|= または 等しい
^= Xor Equal

ビットごとの演算子は、 int データ型と uint データ型でのみ動作するように定義されます。 float データ型または構造体データ型でビットごとの演算子を使用しようとすると、エラーが発生します。 ビットごとの演算子は、他の演算子に関して C と同じ優先順位に従います。

バイナリ キャスト

整数と浮動小数点型の間でキャストすると、C の切り捨て規則に従って数値が変換されます。 float から int への値のキャストと float への戻りは、ターゲット データ型の精度に依存する損失の変換です。 変換関数の一部は 、asfloat (DirectX HLSL)asint (DirectX HLSL)asuint (DirectX HLSL) です

バイナリ キャストは、HLSL 組み込み関数を使用して実行することもできます。 これにより、コンパイラは数値のビット表現をターゲット データ型に再解釈します。

シェーダー モデル 4