セマンティクス

セマンティックとは、パラメーターの意図された使用方法に関する情報を伝達するシェーダーの入力または出力にアタッチされた文字列です。 セマンティクスは、シェーダー ステージ間で渡されるすべての変数で必要です。 シェーダー変数にセマンティックを追加するための構文を次に示します (変数構文 (DirectX HLSL) )。

一般に、パイプライン ステージ間で渡されるデータは完全にジェネリックであり、システムによって一意に解釈されません。特別な意味を持たない任意のセマンティクスが許可されます。 これらの特殊なセマンティクスを含むパラメーター (Direct3D 10 以降) は、 システム値セマンティクスと呼ばれます。

Direct3D 9 および Direct3D 10 以降でサポートされるセマンティクス

Direct3D 9 と Direct3D 10 以降の両方で、次の種類のセマンティクスがサポートされています。

頂点シェーダーのセマンティクス

これらのセマンティクスは、頂点シェーダー パラメーターにアタッチされる場合に意味があります。 これらのセマンティクスは、Direct3D 9 と Direct3D 10 以降の両方でサポートされています。

入力 説明 Type
BINORMAL[n] Binormal 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
出力 説明 Type
COLOR[n] 拡散または反射の色 float4
頂点霧 float
POSITION[n] 同種空間内の頂点の位置。 (x,y,z) を w で除算して、画面空間での位置を計算します。 すべての頂点シェーダーは、このセマンティックを使用してパラメーターを書き出す必要があります。 float4
PSIZE ポイントのサイズ float
TESSFACTOR[n] テセレーション係数 float

n は、0 からサポートされているリソースの数までの省略可能な整数です。 たとえば、POSITION0、TEXCOORD1などです。

ピクセル シェーダーのセマンティクス

これらのセマンティクスは、ピクセル シェーダー入力パラメーターにアタッチされる場合に意味があります。 これらのセマンティクスは、Direct3D 9 と Direct3D 10 以降の両方でサポートされています。

入力 説明 Type
COLOR[n] 拡散または反射の色。 float4
TEXCOORD[n] テクスチャ座標 float4
VFACE 背面プリミティブを示す浮動小数点スカラー。 負の値は後方に向き、正の値はカメラに向かっています。

注:
このセマンティックは、 Direct3D 9 シェーダー モデル 3.0 で使用できます。 Direct3D 10 以降の場合は、代わりに SV_IsFrontFace を使用します。


float
VPOS 画面空間内のピクセル位置 (x、y)。 Direct3D 9 シェーダー (このセマンティックを使用) を Direct3D 10 以降のシェーダーに変換するには、「 Direct3D 9 VPOS および Direct3D 10 SV_Position」を参照してください。 float2
出力 説明 Type
COLOR[n] 出力の色 float4
DEPTH[n] 出力の深さ float

n は、0 からサポートされているリソースの数までの省略可能な整数です。 たとえば、PSIZE0、COLOR1 などです。

COLOR セマンティックは、シェーダー互換性モードでのみ有効です (つまり、シェーダーがD3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITYを使用して作成される場合)。

Direct3D 10 以降でのみサポートされるセマンティクス。

Direct3D 10 では次の種類のセマンティクスが新しく導入され、Direct3D 9 では使用できません。

System-Value セマンティクス

システム値セマンティクスは、Direct3D 10 の新機能です。 すべてのシステム値はSV_プレフィックスで始まり、一般的な例はSV_POSITIONであり、ラスタライザー ステージによって解釈されます。 システム値は、パイプラインの他の部分で有効です。 たとえば、SV_Positionは、頂点シェーダーへの入力と出力として指定できます。 ピクセル シェーダーは、SV_DepthとSV_Targetシステム値セマンティクスを使用してのみパラメーターに書き込むことができます。

その他のシステム値 (SV_VertexID、SV_InstanceID、SV_IsFrontFace) は、特定の値を解釈できるパイプライン内の最初のアクティブ シェーダーにのみ入力できます。その後、シェーダー関数は値を後続のステージに渡す必要があります。

SV_PrimitiveIDは、特定の値を解釈できるパイプライン内の最初のアクティブなシェーダーへの入力のみであるというこのルールの例外です。ハードウェアは、ハル シェーダー ステージ、ドメイン シェーダー ステージへの入力と同じ ID 値を提供できます。その後、最初に有効になっているステージは geometry-shader ステージまたはピクセル シェーダー ステージです。

テセレーションが有効になっている場合は、ハル シェーダー ステージとドメイン シェーダー ステージが存在します。 特定のパッチの場合、同じ PrimitiveID がパッチのハル シェーダー呼び出しと、すべてのテセレーションドメイン シェーダー呼び出しに適用されます。 同じ PrimitiveID も次のアクティブ ステージに伝達されます。geometry-shader ステージまたはピクセル シェーダー ステージ (有効な場合)。

ジオメトリ シェーダー入力がSV_PrimitiveIDし、呼び出しごとに 0 個以上のプリミティブを出力できるため、後続のピクセル シェーダー入力がSV_PrimtiveID場合、シェーダーは出力プリミティブごとに独自のSV_PrimitiveID値の選択をプログラムする必要があります。

もう 1 つの例として、頂点は複数のプリミティブのメンバーにできるため、頂点シェーダー ステージではSV_PrimitiveIDを解釈できません。

これらのセマンティクスは Direct3D 10 に追加されています。Direct3D 9 では使用できません。

ラスタライザー ステージのシステム値セマンティクス。

System-Value セマンティック 説明 Type
SV_ClipDistance[n] 距離データをクリップします。 SV_ClipDistance値はそれぞれ、平面への float32 符号付き距離であると見なされます。 プリミティブセットアップでは、補間された平面距離が 0 であるピクセルに対してのみラスター化が呼び出されます >。 1 つ以上の頂点要素の複数のコンポーネントをSV_ClipDistanceとして宣言することで、複数のクリップ プレーンを同時に実装できます。 結合されたクリップとカリング距離の値は、最大 D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT レジスタ内の最大 D3D#_CLIP_OR_CULL_DISTANCE_COUNT コンポーネントです。 値を書き込むことができるが入力として受け取らない頂点シェーダーを除き、読み取りまたは書き込み先のすべてのシェーダーで使用できます。
clipplanes 属性はSV_ClipDistanceと同様に機能しますが、9_x以上のすべてのハードウェア機能レベルで動作します。 詳細については、「 機能レベル 9 ハードウェアのユーザー クリップ プレーン」を参照してください。
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 ピクセル シェーダーの入力、出力、または両方で指定できるマスク。
ピクセル シェーダーでのSV_Coverageの場合、OUTPUT は ps_4_1 以上でサポートされます。
ピクセル シェーダーでSV_Coverageする場合、INPUT にはps_5_0以上が必要です。
uint
SV_Depth 深度バッファー データ。 ピクセル シェーダーで記述できます。 float
SV_DepthGreaterEqual ピクセル シェーダーでは、ラスタライザーによって決定された値以上である限り、深度を出力できます。 初期 Z を無効にせずに深度の調整を有効にします。 float
SV_DepthLessEqual ピクセル シェーダーでは、ラスタライザーによって決定された値以下である限り、深度を出力できます。 初期 Z を無効にせずに深度の調整を有効にします。 float
SV_DispatchThreadID ディスパッチ呼び出し内のグローバル スレッド オフセットを、グループのディメンションごとに定義します。 計算シェーダーへの入力として使用できます。 (読み取り専用) uint3
SV_DomainLocation 評価される現在のドメイン ポイントのハル上の位置を定義します。 ドメイン シェーダーへの入力として使用できます。 (読み取り専用) float2|3
SV_GroupID ディスパッチ呼び出しのディメンションごとに、ディスパッチ呼び出し内のグループ オフセットを定義します。 コンピューティング シェーダーへの入力として使用できます。 (読み取り専用) uint3
SV_GroupIndex 特定のグループ内の特定のスレッドのフラット化インデックスを提供します。 コンピューティング シェーダーへの入力として使用できます。 (読み取り専用) uint
SV_GroupThreadID グループのディメンションごとに、グループ内のスレッド オフセットを定義します。 コンピューティング シェーダーへの入力として使用できます。 (読み取り専用) uint3
SV_GSInstanceID ジオメトリ シェーダーのインスタンスを定義します。 ジオメトリ シェーダーへの入力として使用できます。 インスタンスは、同じジオメトリ プリミティブで最大 32 回呼び出すことができるジオメトリ シェーダーとして必要です。 uint
SV_InnerCoverage 過小評価された保守的なラスター化情報 (つまり、ピクセルが完全にカバーされることを保証するかどうか) を表します。 ピクセル シェーダーで読み取りまたは書き込みが可能です。
SV_InsideTessFactor パッチ サーフェス内のテセレーション量を定義します。 書き込み用のハル シェーダーで使用でき、読み取り用のドメイン シェーダーで使用できます。 float|float[2]
SV_InstanceID ランタイムによって自動的に生成されるインスタンスごとの識別子 ( 「System-Generated 値の使用 (Direct3D 10)」を参照)。 すべてのシェーダーで使用できます。
SV_IsFrontFace 三角形を正面に向けるかどうかを指定します。 線と点の場合、IsFrontFace の値は true です。 例外は、三角形から引き出される線 (ワイヤーフレーム モード) です。IsFrontFace は、三角形をソリッド モードでラスター化するのと同じ方法で設定されます。 ジオメトリ シェーダーによって に書き込まれ、ピクセル シェーダーによって読み取ることができます。 [bool]
SV_OutputControlPointID ハル シェーダーのメインエントリ ポイントの呼び出しによって操作されるコントロール ポイント ID のインデックスを定義します。 ハル シェーダーでのみ読み取ることができます。 uint
SV_Position シェーダーへの入力に対してSV_Position宣言すると、linearNoPerspective または linearNoPerspectiveCentroid という 2 つの補間モードのいずれかを指定できます。後者では、マルチサンプリングアンチエイリアシング時に重心スナップ xyzw 値が指定されます。 シェーダーで使用する場合、SV_Positionはピクセルの位置を記述します。 0.5 オフセットのピクセル中心を取得するために、すべてのシェーダーで使用できます。 float4
SV_PrimitiveID ランタイムによって自動的に生成されるプリミティブごとの識別子 ( 「System-Generated 値の使用 (Direct3D 10)」を参照)。 geometry シェーダーまたはピクセル シェーダーによって に書き込み、ジオメトリ、ピクセル、ハル、またはドメイン シェーダーによって読み取ることができます。 uint
SV_RenderTargetArrayIndex レンダー ターゲット配列インデックス。 ジオメトリ シェーダー出力に適用され、ピクセル シェーダーによってプリミティブが描画されるレンダー ターゲット配列スライスを示します。 SV_RenderTargetArrayIndexは、レンダー ターゲットが配列リソースである場合にのみ有効です。 このセマンティックはプリミティブにのみ適用されます。プリミティブに複数の頂点がある場合は、先頭の頂点の値が使用されます。 この値は、読み取り/書き込みの目的で使用される深度/ステンシル ビューの配列スライスも示します。
ジオメトリ シェーダーから書き込み、ピクセル シェーダーで読み取ることができます。
D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer が の場合、trueラスタライザーを供給するすべてのシェーダーにSV_RenderTargetArrayIndexが適用されます。
uint
SV_SampleIndex 頻度インデックス データのサンプル。 ピクセル シェーダーでのみ読み取りまたは書き込みが可能です。 uint
SV_StencilRef 現在のピクセル シェーダー ステンシル参照値を表します。 ピクセル シェーダーでのみ書き込むことができます。 uint
SV_Target[n], where 0 <= n <= 7 レンダー ターゲットに格納される出力値。 インデックスは、8 つのバインドされたレンダー ターゲットのうち、書き込み先となる可能性のあるターゲットを示します。 値はすべてのシェーダーで使用できます。 float[2|3|4]
SV_TessFactor パッチの各エッジのテセレーション量を定義します。 ハル シェーダーでの書き込みとドメイン シェーダーでの読み取りに使用できます。 float[2|3|4]
SV_VertexID ランタイムによって自動的に生成される頂点ごとの識別子 ( 「System-Generated 値の使用 (Direct3D 10)」を参照)。 頂点シェーダーへの入力としてのみ使用できます。 uint
SV_ViewportArrayIndex ビューポート配列インデックス。 ジオメトリ シェーダーの出力に適用され、現在書き出されているプリミティブに使用するビューポートを示します。ピクセル シェーダーで読み取ることができます。 プリミティブは、ラスタライザーに渡される前に、インデックスで指定されたビューポートに対して変換およびクリップされます。 このセマンティックはプリミティブにのみ適用されます。プリミティブに複数の頂点がある場合は、先頭の頂点の値が使用されます。
D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer が の場合、trueラスタライザーを供給するすべてのシェーダーにSV_ViewportArrayIndexが適用されます。
uint
SV_ShadingRate シェーディング レート を使用して、可変シェーディング レート レベル 2 以降のデバイスに対して 1 つのピクセル シェーダー呼び出しによって書き込まれるピクセル数を定義します。 ピクセル シェーダーから読み取ることができます。 頂点シェーダーまたはジオメトリ シェーダーから書き込むことができます。 uint

SV_Depth書き込み時の制限事項:

  • マルチサンプリング (MultisampleEnable がD3D10_RASTERIZER_DESCTRUE) で深度値を書き込む場合 (ピクセル シェーダーを使用)、書き込まれた単一の値も深度テストで使用されます。そのため、マルチサンプリング時にプリミティブ エッジを高解像度でレンダリングする機能が失われます。
  • 動的フロー制御を使用する場合、コンパイル時に、一部のパスでSV_Depthを書き込むシェーダーが、すべての実行でSV_Depth書き込みが保証されるかどうかを判断することはできません。 宣言時にSV_Depthを書き込めなかった場合、未定義の動作が発生します (ピクセルの破棄を含む場合と含まない場合があります)。
  • +/-INF や NaN を含む float32 値は、SV_Depthに書き込むことができます。
  • デュアル ソース カラー ブレンドを実行する場合、SV_Depthの書き込みは引き続き有効です。

Direct3D 9 から Direct3D 10 以降への移行

Direct3D 9 から Direct3D 10 以降にコードを移行する場合は、次の問題を考慮する必要があります。

Direct3D 9 セマンティクスへのマッピング

いくつかの 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 
}

POSITION セマンティックはオブジェクト空間座標を対象としていたため、画面空間座標を指定するためにシェーダー モデル 3 のサポート用に VPOS が追加されました。

Direct3D 10 以降では、SV_Position セマンティック (ピクセル シェーダーのコンテキストで使用される場合) は、画面空間座標 (0.5 でオフセット) を指定します。 したがって、Direct3D 9 シェーダーは、(0.5 オフセットを占めずに) 次とほぼ同じになります。

float4 psMainD3D10( float4 screenSpace : SV_Position ) : COLOR
{
    // code here
}

Direct3D 9 から Direct3D 10 以降に移行する場合は、シェーダーを翻訳するときにこの点に注意する必要があります。

HLSL のユーザー クリップ プレーン

Windows 8 以降では、機能レベル 9_xおよび機能レベル 10 以上でシェーダーを動作させるには、SV_ClipDistanceではなく、HLSL 関数宣言clipplanes 関数属性を使用できます。 詳細については、「 機能レベル 9 ハードウェアのユーザー クリップ プレーン」を参照してください。