共通シェーダー コア (DirectX HLSL)

シェーダー モデル 4 では、共通シェーダー コアを使用した同じ基本機能がすべてのシェーダー ステージに実装されています。さらに、3 つのシェーダー ステージ (頂点、ジオメトリ、およびピクセル) のそれぞれが、各ステージ固有の機能を提供しています。たとえば、ジオメトリ シェーダー ステージから新しいプリミティブを生成したり、ピクセル シェーダー ステージで特定のピクセルを破棄するなどの機能です。次の概念図は、シェーダー ステージを中心としたデータの流れ、および共通シェーダー コアとシェーダー メモリー リソースとの関係を示しています。

図形 1.  共通シェーダー コア

Ee418282.d3d10_shader_unit(ja-jp,VS.85).gif

  • 入力データ:頂点シェーダーは、入力アセンブラー ステージからの入力を受け取ります。また、ジオメトリ シェーダーおよびピクセル シェーダーも、同様にそれぞれ前のステージから入力を受け取ります。新しく追加された入力には、システム値セマンティクスが含まれます。システム値セマンティクスは、適切なパイプライン内の最初のユニットによって使用されます。
  • 出力データ:シェーダーは、パイプラインの次のステージに渡すための出力結果を生成します。ジオメトリ シェーダーでは、それぞれの呼び出しからのデーター出力量は異なる可能性があります。一部の出力は、共通シェーダー コアによって解釈されます (頂点位置やレンダー ターゲット配列インデックスなど)。また、その他の出力は、アプリケーションによって解釈されるように設計されています。
  • シェーダー コード:シェーダーは、メモリーからの読み取りや、ベクトル浮動小数点や整数の算術演算、フロー制御処理を行うことができます。シェーダーで実行できるステートメントの数は限られていません。
  • サンプラ:サンプラは、テクスチャーのサンプリングおよびフィルタリングの方法を定義します。最大 16 個のサンプラを、同時に 1 つのシェーダーにバインドすることができます。
  • テクスチャー:テクスチャーは、サンプラを使用してフィルタリングしたり、load 組み込み関数を使用してテクセルごとに直接読み取ることができます。
  • バッファー:バッファーはフィルタリングの対象にはなりませんが、load 組み込み関数を使用して要素ごとにメモリーから直接読み取ることができます。合計で最大 128 個のテクスチャー リソースおよびバッファー リソースを、同時に 1 つのシェーダーにバインドすることができます。
  • 定数バッファー:定数バッファーは、シェーダー定数変数で使用するために最適化されています。最大 16 個の定数バッファーを、同時に 1 つのシェーダー ステージにバインドすることができます。定数バッファーは、CPU からより頻繁に更新が行えるように設計されているため、追加のサイズ、レイアウト、およびアクセス制限が採用されています。

Direct3D 9 と Direct3D 10 の違い

Direct3D 9では、それぞれのシェーダー ユニットは、すべての定数シェーダー変数を格納するための単一の小さな定数レジスタ ファイルを持っていました。すべてのシェーダーをこの限定された定数領域に格納するには、CPU による頻繁な定数のリサイクルを必要としました。

Direct3D 10 では、定数はメモリー内の固定バッファーに格納され、他のリソースと同様に管理されます。アプリケーションが作成できる定数バッファーの数に制限はありません。更新および使用の頻度によってバッファーに定数を整理することで、すべてのシェーダーを格納するための定数の更新に必要な帯域幅の量を大幅に減らすことができます。

整数およびビットごとのサポート

共通シェーダー コアは、IEEE 準拠の 32 ビット整数およびビットごとの演算の完全なセットを提供します。これらの演算は、圧縮技術やパッキング技術、FFT、ビットフィールド プログラム フロー制御などの、グラフィックス ハードウェアのアルゴリズムの新しいクラスを有効にします。

Direct3D 10 HLSL の int および uint データ型は、ハードウェアの 32 ビット整数にマップします。

Direct3D 9 と Direct3D 10 の違い

Direct3D 9 では、HLSL で整数としてマーク付けされたストリーム入力は、浮動小数点数として解釈されました。Direct3D 10 では、整数としてマーク付けされたストリームは、32 ビットの整数として解釈されます。

また、ブール値は、すべてのビットがオンか、すべてのビットがオフになります。bool に変換されたデータは、値が 0.0f と等しくなければ TRUE として解釈され (正の 0 と負の 0 のどちらも FALSE となります) 、それ以外の場合は FALSE として解釈されます。

ビット演算子

共通シェーダー コアは、次のビット演算子をサポートしています。

演算子 関数
~ 論理 NOT
<< 左シフト
>> 右シフト
& 論理 AND
| 論理 OR
^ 論理 XOR
<<= 左シフト後代入
>>= 右シフト後代入
&= AND 後代入
|= OR 後代入
^= XOR 後代入

ビット演算子は、int および uint データ型に対してのみ使用できます。ビット演算子を float または struct データ型に対して使用すると、エラーが発生します。ビット演算子の優先順位については、C と同じ規則が適用されます。

バイナリ キャスト

整数型と浮動小数点型のキャスト演算では、切り捨てに関する C の規則に従って、数値を変換します。値を float から int にキャストした後で、再度 float にキャストすると、ターゲット データ型の精度の違いによって桁が切り捨てられ、元の値とは異なる結果が生じる場合があります。変換関数には、asfloat (DirectX HLSL)asint (DirectX HLSL)asuint (DirectX HLSL) などがあります。

バイナリ キャストも HLSL 組み込み関数を使用して実行できます。この場合、コンパイラは、数値のビット表現を、変換対象のデータ型に合わせて解釈し直します。