Semantics

セマンティックとは、パラメーターの使用目的に関する情報を伝達するシェーダーの入力または出力に付随する文字列です。 セマンティクスは、シェーダー ステージ間で渡されるすべての変数で必要となります。 シェーダー変数にセマンティックを追加するための構文をこちらに示します (変数構文 (DirectX HLSL))。

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

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

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

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

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

入力 説明 Type
BINORMAL[n] 従法線 float4
BLENDINDICES[n] Blend インデックス uint
BLENDWEIGHT[n] Blend ウェイト 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
FOG 頂点のフォグ float
POSITION[n] 同種空間における頂点の位置。 (x,y,z) を w で除算して、画面空間での位置を計算します。 すべての頂点シェーダーは、このセマンティックを使用してパラメーターを書き出す必要があります。 注: このセマンティックは Direct3D 9 で使用できます。 Direct3D 10 以降では、代わりに SV_Position を使用します。 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 では使用できません。

システム値のセマンティクス

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

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

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

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

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

別の例として、頂点は複数の基本要素の一部になる可能性があるため、SV_PrimitiveID は頂点シェーダー ステージでは解釈できません。

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

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

システム値セマンティック 説明 Type
SV_ClipDistance[n] クリップ距離データ。 SV_ClipDistance 値はそれぞれ、平面への float32 符号付き距離であると見なされます。 Primitive セットアップでは、補間された平面距離が >= 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 Dispatch 呼び出し内のグローバル スレッドのオフセットを、グループの分析コードごとに定義します。 コンピューティング シェーダーへの入力として使用できます。 (読み取り専用) uint3
SV_DomainLocation 評価されている現在のドメイン ポイントのハル上の位置を定義します。 ドメイン シェーダーへの入力として使用できます。 (読み取り専用) float2|3
SV_GroupID Dispatch 呼び出しの分析コードごとに、Dispatch 呼び出し内のグループ オフセットを定義します。 コンピューティング シェーダーへの入力として使用できます。 (読み取り専用) uint3
SV_GroupIndex 特定のグループ内の特定のスレッドのフラット化インデックスを提供します。 コンピューティング シェーダーへの入力として使用できます。 (読み取り専用) uint
SV_GroupThreadID グループの分析コードごとに、グループ内のスレッド オフセットを定義します。 コンピューティング シェーダーへの入力として使用できます。 (読み取り専用) uint3
SV_GSInstanceID ジオメトリ シェーダーのインスタンスを定義します。 ジオメトリ シェーダーへの入力として使用できます。 同じジオメトリの基本要素でジオメトリ シェーダーを最大 32 回呼び出すことができるので、そのインスタンスが必要です。 uint
SV_InnerCoverage 過小評価された旧来のラスター化情報を表します (つまり、ピクセルが完全にカバーされていることが保証されているかどうか)。 ピクセル シェーダーで読み取りまたは書き込みが可能です。
SV_InsideTessFactor パッチ サーフェス内のテッセレーション量を定義します。 書き込みに関してはハル シェーダーで、読み取りに関しては ドメイン シェーダーで使用できます。 float|float[2]
SV_InstanceID ランタイムによって自動的に生成されるインスタンスごとの識別子 (「システム生成値の使用 (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 ランタイムによって自動的に生成される基本要素ごとの識別子 (「システム生成値の使用 (Direct3D 10)」を参照)。 ジオメトリ シェーダーまたはピクセル シェーダーによって書き込まれ、ジオメトリ、ピクセル、ハル、またはドメイン シェーダーによって読み取りできます。 uint
SV_RenderTargetArrayIndex レンダー ターゲット配列インデックス。 ジオメトリ シェーダー出力に適用され、基本要素がピクセル シェーダーによって描画されるレンダー ターゲット配列スライスを示します。 SV_RenderTargetArrayIndex は、レンダー ターゲットが配列リソースである場合にのみ有効です。 このセマンティックは基本要素にのみ適用されます。基本要素に複数の頂点がある場合は、先頭の頂点の値が使用されます。 この値は、読み取り/書き込みに使用される深度/ステンシル ビューの配列スライスも示します。
ジオメトリ シェーダーから書き込み、ピクセル シェーダーで読み取ることができます。
D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizertrue である場合、ラスタライザーをフィードするすべてのシェーダーに SV_RenderTargetArrayIndex が適用されます。
uint
SV_SampleIndex 頻度インデックス データのサンプル。 ピクセル シェーダーのみが読み取りまたは書き込みを行えます。 uint
SV_StencilRef 現時点でのピクセル シェーダー ステンシル参照値を表します。 ピクセル シェーダーでのみ書き込むことができます。 uint
SV_Target[n], 0 <= n <= 7 の場合 レンダー ターゲットに格納される出力値。 インデックスは、8 個のバインドされたレンダー ターゲットのうち、どのターゲットに書き込むかを示します。 この値は、すべてのシェーダーに使用できます。 float[2|3|4]
SV_TessFactor パッチの各エッジのテッセレーション量を定義します。 ハル シェーダーでの書き込みと ドメイン シェーダーでの読み取りに使用できます。 float[2|3|4]
SV_VertexID ランタイムによって自動的に生成される頂点ごとの識別子 (「システム生成値の使用 (Direct3D 10)」を参照)。 頂点シェーダーへの入力としてのみ使用できます。 uint
SV_ViewportArrayIndex ビューポート配列インデックス。 ジオメトリ シェーダーの出力に適用され、現在書き出されている基本要素に使用するビューポートを示します。ピクセル シェーダーで読み取ることができます。 この基本要素は、ラスタライザーに渡される前に、インデックスで指定されたビューポートに対して変換およびクリップされます。 このセマンティックは基本要素にのみ適用されます。基本要素に複数の頂点がある場合は、先頭の頂点の値が使用されます。
D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizertrue の場合、ラスタライザーを供給するすべてのシェーダーに 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 セマンティクスにマップする必要があります。 旧バージョンとの互換性のために、FXC は POSITION0 (およびそのバリアント名) を SV_Position として扱います。 FXC は COLOR を SV_TARGET として扱います。 DXC 以降のコンパイラでは、POSITION[n] と COLOR がユーザー定義セマンティクスと見なされます。

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 以降から、SV_ClipDistanceではなく、HLSL 関数の宣言clipplanes 関数属性を使用することで、機能レベル 9_x はもちろん機能レベル 10 以上でもシェーダーを動作させることができます。 詳細については、「機能レベル 9 ハードウェアのユーザー クリップ プレーン」を参照してください。