セマンティクス (DirectX HLSL)
セマンティクスは、シェーダー入力またはシェーダー出力に付加されている文字列で、パラメーターの使用目的に関する情報を伝達します。セマンティクスは、シェーダー ステージ間で渡されるすべての変数に指定する必要があります。シェーダー変数にセマンティクスを追加するための構文については、「変数構文 (DirectX HLSL)」を参照してください。
通常、パイプライン ステージ間で渡されるのは完全に一般的なデータであり、システムによって一意に解釈されることはありません。そのため、特別な意味を持たないものであれば、任意のセマンティクスを指定することができます。特別な意味を持つセマンティクスを含む Direct3D 10 のパラメーターは、システム値セマンティクスと呼ばれます。
- Direct3D 9 および Direct3D 10 でサポートされているセマンティクス
- Direct3D 10 以降でのみサポートされているセマンティクス
- Direct3D 9 から Direct3D 10 への移行
- ダブル バインド セマンティクス
Direct3D 9 および Direct3D 10 でサポートされているセマンティクス
次のタイプのセマンティクスは、Direct3D 9 および Direct3D 10 の両方でサポートされています。
- 頂点シェーダーのセマンティクス
- ピクセル シェーダーのセマンティクス
頂点シェーダーのセマンティクス
次のセマンティクスは、頂点シェーダー パラメーターに付加される場合に意味を持ちます。これらのセマンティクスは、Direct3D 9 および Direct3D 10 の両方でサポートされています。
入力 | 説明 | タイプ |
---|---|---|
BINORMAL[n] | 従法線 | float4 |
BLENDINDICES[n] | ブレンド インデックス | uint |
BLENDWEIGHT[n] | ブレンドの重み | float |
COLOR[n] | ディフューズ カラーとスペキュラ カラー | float4 |
NORMAL[n] | 法線ベクトル | float4 |
POSITION[n] | オブジェクト空間内の頂点位置。 | float4 |
POSITIONT | トランスフォームされた頂点位置。 | float4 |
PSIZE[n] | ポイント サイズ | float |
TANGENT[n] | 接線 | float4 |
TEXCOORD[n] | テクスチャー座標 | float4 |
出力 | 説明 | 型 |
COLOR[n] | ディフューズ カラーまたはスペキュラ カラー | float4 |
FOG | 頂点フォグ | float |
POSITION[n] | 均質空間内の頂点の位置。(x,y,z) を w で除算することで、スクリーン空間内の位置を計算します。すべての頂点シェーダーでは、このセマンティクスを使用してパラメーターを書き出す必要があります。 | float4 |
PSIZE | ポイント サイズ | float |
TESSFACTOR[n] | テッセレーション係数 | float |
TEXCOORD[n] | テクスチャー座標 | float4 |
n は、0 ~ (サポートされているリソースの数) の範囲のオプションの整数です。たとえば、POSITION0、TEXCOOR1 です。
ピクセル シェーダーのセマンティクス
次のセマンティクスは、ピクセル シェーダー入力パラメーターに付加される場合に意味を持ちます。これらのセマンティクスは、Direct3D 9 および Direct3D 10 の両方でサポートされています。
入力 | 説明 | タイプ |
---|---|---|
COLOR[n] | ディフューズ カラーとスペキュラ カラー | float4 |
TEXCOORD[n] | テクスチャー座標 | float4 |
VFACE | 背面のプリミティブを示す浮動小数点スカラーです。負の値は裏向きであることを示し、正の値はカメラ側を向いていることを示します。 | float |
VPOS | スクリーン空間内のピクセル位置 (x,y) です。このセンマンティクスを使用する Direct3D 9 シェーダーを Direct3D 10 シェーダーに変換するには、「Direct3D 9 の VPOS と Direct3D 10 の SV_Position」を参照してください。 | float2 |
出力 | 説明 | 型 |
COLOR[n] | 出力カラー | float4 |
DEPTH[n] | 出力深度 | float |
n は、0 ~ (サポートされているリソースの数) の範囲のオプションの整数です。たとえば、PSIZE0、COLOR1 です。
COLOR セマンティクスは、シェーダー互換性モード (つまり、シェーダーが D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY を使用して作成された場合) でのみ有効です。
Direct3D 10 以降でのみサポートされているセマンティクス
次のタイプのセマンティクスは、Direct3D 10 で新たに導入されたものであり、Direct3D 9 では利用できません。
- システム値セマンティクス
システム値セマンティクス
システム値セマンティクスは Direct3D 10 で新たに導入されたものです。すべてのシステム値は SV_ プレフィックスで始まり (SV_POSITION など)、ラスタライザー ステージによって解釈されます。システム値は、パイプラインの他の部分でも有効です。たとえば、SV_Position は、頂点シェーダーへの入力および出力として指定することができます。ピクセル シェーダーは、SV_Depth および SV_Target システム値セマンティクスを持つパラメーターにのみ書き込むことができます。
その他のシステム値 (SV_VertexID、SV_PrimitiveID、SV_InstanceID、SV_IsFrontFace) は、特定の値を解釈することのできるパイプライン内のアクティブ シェーダーへの入力としてのみ指定することができます。たとえば、SV_PrimitiveID を、頂点シェーダー ステージが解釈することはできません。それは、1 つの頂点が複数のプリミティブのメンバーとなる可能性があるためです。そのため、SV_PrimitiveID は、ジオメトリ シェーダー ステージ、または (ジオメトリ シェーダー ステージがアクティブでない場合は) ピクセル シェーダー ステージでのみ利用できます。
これらのセマンティクスは、Direct3D 10 で追加されており、Direct3D 9 では利用できません。
ラスタライザー ステージで解釈されるシステム値セマンティクス。
システム値セマンティクス | 説明 | タイプ |
---|---|---|
SV_ClipDistance[n] | クリップ距離データです。それぞれの SV_ClipDistance の値は、符号付き float32 型で表した平面までの距離と見なされます。プリミティブのセットアップでは、補間した平面距離が 0 以上であるピクセルについてのみラスター化が実行されます。複数のクリップ平面を同時に実装するには、1 つ以上の頂点要素の複数の成分を SV_ClipDistance として宣言します。クリップ距離とカリング距離の組み合わせの数は、最大 D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT 個のレジスタにある最大 D3D#_CLIP_OR_CULL_DISTANCE_COUNT 個の成分の数になります。
頂点シェーダーとジオメトリ シェーダーで書き込み可能です。 |
float |
SV_CullDistance[n] | カリング距離データです。頂点要素の成分にこのラベルを割り当てると、これらの各値は符号付き float32 型で表した平面までの距離と見なされます。プリミティブにあるすべての頂点で平面までの距離を 0 未満とすると、そのプリミティブは完全に破棄されます。複数のカリング平面を同時に使用するには、1 つ以上の頂点要素の複数の成分を SV_CullDistance として宣言します。クリップ距離とカリング距離の組み合わせの数は、最大 D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT 個のレジスタにある最大 D3D#_CLIP_OR_CULL_DISTANCE_COUNT 個の成分の数になります。
頂点シェーダーとジオメトリ シェーダーで書き込み可能です。 |
float |
SV_Coverage | 出力カバレッジ マスク | bool |
SV_Depth | 深度バッファー データです。ピクセル シェーダーから書き込み可能です。 | float |
SV_DispatchThreadID | Dispatch 呼び出しでのグローバル スレッド オフセットを、そのグループの次元ごとに定義します。コンピュート シェーダーへの入力として使用できます。(読み取り専用) | uint3 |
SV_DomainLocation | 評価対象とする現在のドメイン ポイントがハル上で占める位置を定義します。ドメイン シェーダーへの入力として使用できます。(読み取り専用) | float2|3 |
SV_GroupID | Dispatch 呼び出しでのグループ オフセットを、そのディスパッチ呼び出しの次元ごとに定義します。コンピュート シェーダーへの入力として使用できます。(読み取り専用) | uint3 |
SV_GroupIndex | 特定のグループにある特定のスレッドについて、平面化したインデックスを指定します。コンピュート シェーダーへの入力として使用できます。(読み取り専用) | uint |
SV_GroupThreadID | グループでのスレッド オフセットを、そのグループの次元ごとに定義します。コンピュート シェーダーへの入力として使用できます。(読み取り専用) | uint3 |
SV_GSInstanceID | ジオメトリ シェーダーのインスタンスを定義します。ジオメトリ シェーダーへの入力として使用できます。(読み取り専用) | uint |
SV_InsideTessFactor | パッチ サーフェス内のテッセレーション量を定義します。ハル シェーダーで書き込み可能、ドメイン シェーダーで読み取り可能です。 | float|float[2] |
SV_IsFrontFace | 線と点については、IsFrontFace の値は true です。例外として、ワイヤー フレーム モードで三角形から外方向に描画した線については、ソリッド モデルで三角形をラスター化する場合と同じように IsFrontFace が設定されます。ピクセル シェーダーへの入力として使用できます。(読み取り専用) | bool |
SV_OutputControlPointID | ハル シェーダーのメイン エントリー ポイントの呼び出しによって処理するコントロール ポイント ID のインデックスを定義します。ドメイン シェーダーへの入力として使用できます。(読み取り専用) | uint |
SV_Position | ピクセル シェーダーへの入力に対して SV_Position を宣言すると、その入力では補間モードとして linearNoPerspective または linearNoPerspectiveCentroid を指定できます。linearNoPerspectiveCentroid を指定すると、マルチサンプルのエイリアシングの際に、重心にスナップされた xyzw 値が得られます。ピクセル シェーダーで使用する SV_Position はピクセル位置を表します。頂点シェーダーとジオメトリ シェーダーで読み取りおよび書き込みが可能です。ピクセル シェーダーでは、SV_Position を読み取り専用として使用し、0.5 のオフセットでピクセルの中心を取得できます。 | float4 |
SV_RenderTargetArrayIndex | レンダー ターゲットの配列のインデックスです。ジオメトリ シェーダーの出力に適用し、レンダー ターゲットの配列のスライスのうち、ピクセル シェーダーによるプリミティブの描画先となるものを示します。SV_RenderTargetArrayIndex は、レンダー ターゲットが配列リソースの場合にのみ有効です。このセマンティクスはプリミティブのみに適用され、プリミティブに複数の頂点がある場合は、先頭頂点の値が使用されます。
この値は、depthstencilview のどの配列スライスが読み取りや書き込みの目的で使用されるのかも示します。 ジオメトリ シェーダーから書き込み可能であり、ピクセル シェーダーで読み取り可能です。 |
uint |
SV_SampleIndex | サンプル頻度インデックス データ | uint |
SV_Target[n], ここで、0 <= n <= 7 | レンダー ターゲットに格納する出力値です。このインデックスは、バインドされていると考えられる 8 つのレンダー ターゲットのうち、どれが書き込み先となるのかを示します。この値は、ピクセル シェーダーからの出力として使用できます。(書き込み専用) | float |
SV_TessFactor | パッチの各エッジ上のテッセレーション量を定義します。ハル シェーダーで書き込み可能、ドメイン シェーダーで読み取り可能です。 | float、int |
SV_ViewportArrayIndex | ビューポートの配列のインデックスです。ジオメトリ シェーダーの出力に適用し、現在書き出しているプリミティブで使用するビューポートを示します。プリミティブは、このインデックスで指定したビューポートを基準としてトランスフォームおよびクリッピングされてから、ラスタライザーに渡されます。このセマンティクスはプリミティブのみに適用され、プリミティブに複数の頂点がある場合は、先頭頂点の値が使用されます。 | uint |
SV_InstanceID | ランタイムによって自動的に生成されるインスタンス単位の識別子です (「システム生成値の使用 (Direct3D 10)」を参照)。 | uint |
SV_PrimitiveID | ランタイムによって自動的に生成されるプリミティブ単位の識別子です (「システム生成値の使用 (Direct3D 10)」を参照)。 | uint |
SV_VertexID | ランタイムによって自動的に生成される頂点単位の識別子です (「システム生成値の使用 (Direct3D 10)」を参照)。 | uint |
SV_Depth の書き込み時の制限事項
- マルチサンプリング (D3D10_RASTERIZER_DESC の MultisampleEnable を TRUE とした場合) の際にピクセル シェーダーを使用して深度値を書き込むと、書き出される単一の値は深度テストでも使用されます。そのため、マルチサンプリング時は、プリミティブのエッジをより高い解像度でレンダリングすることはできません。
- 動的フロー制御を使用する場合、一部のパスに SV_Depth を記述するシェーダーが、すべての実行で必ず SV_Depth を記述するかどうかを、コンパイル時に判定することはできません。宣言時に SV_Depth を記述し忘れると、予測できない結果が生じます (ピクセルが破棄される場合もあります)。
- +/-INF および NaN を含む float32 値はいずれも SV_Depth に記述することができます。
- SV_Depth の記述は、デュアル ソース カラー ブレンドの実行時でも有効です。
Direct3D 9 から Direct3D 10 への移行
コードを Direct3D 9 から Direct3D 10 に移行する際は、次の問題を考慮する必要があります。
Direct3D 9 のセマンティクスへのマッピング
次の 3 つの Direct3D 10 のセマンティクスは、Direct3D 9 のセマンティクスに直接マップしています。
Direct3D 10 セマンティクス | 対応する Direct3D 9 セマンティクス |
---|---|
SV_Depth | DEPTH |
SV_Position | POSITION |
SV_Target | COLOR |
Direct3D 9 開発者への注意事項:
Direct3D 9 ターゲットには、有効な Direct3D 9 セマンティクスにマップしているシェーダー セマンティクスを必ず使用してください。下位互換を維持するために、POSITION0 (およびそのバリアント名) は SV_Position として扱われ、COLOR は SV_TARGET として扱われます。 |
Direct3D 9 の VPOS と Direct3D 10 の SV_Position
D3D10 の SV_Position セマンティクスは、Direct3D 9 シェーダー モデル 3 の VPOS セマンティクスと同様の機能を提供します。たとえば、Direct3D 9 では、スクリーン空間座標を使用するピクセル シェーダーに対して次の構文を使用します。
float4 psMainD3D9( float4 screenSpace : VPOS ) : COLOR { // code here }
シェーダー モデル 3 をサポートするために追加された VPOS は、スクリーン空間座標を指定します。これは、POSITION セマンティクスがオブジェクト空間座標を対象としていたからです。
Direct3D 10 では、ピクセル シェーダーのコンテキストで使用する SV_Position セマンティクスは、スクリーン空間座標 (オフセットは 0.5) を指定します。したがって、Direct3D 9 のシェーダーは、0.5 のオフセットを考慮に入れなければ、次のコードとほぼ同じ機能となります。
float4 psMainD3D10( float4 screenSpace : SV_Position ) : COLOR { // code here }
Direct3D 9 から Direct3D 10 に移行する際は、この点に注意してシェーダーを変換する必要があります。
ダブル バインド セマンティクス
同じセマンティクスを複数のパラメーターに適用することができます。次に例を示します。
float4x4 WorldView[60] : WORLDVIEW : register(c16); float4 main( float3 Pos : SV_POSITION, int4 IPos : SV_POSITION ) : SV_POSITION { float3 P = mul(float4(Pos, 1), (float4x3)WorldView[IPos.w]); return float4(P,1); }
この関数は 2 つの引数を取ります。3 成分浮動小数点位置と 4 成分整数位置です。整数位置は、ワールド ビュー行列の配列へのインデックスとして使用されます。