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 | 背面の基本要素を示す浮動小数点スカラー。 負の値は後ろを向き、正の値ならカメラに向きます。
注: |
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::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer が true である場合、ラスタライザーをフィードするすべてのシェーダーに 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::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer が true の場合、ラスタライザーを供給するすべてのシェーダーに SV_ViewportArrayIndex が適用されます。 |
uint |
SV_ShadingRate | シェーディング レート 値 を使用して、可変シェーディング レート レベル 2 以降のデバイスに対して 1 個のピクセル シェーダー呼び出しによって書き込まれるピクセル数を定義します。 ピクセル シェーダーから読み取ることができます。 頂点シェーダーまたはジオメトリ シェーダーから書き込むことができます。 | uint |
SV_Depth を書き込むときの制限事項:
- マルチサンプリング (MultisampleEnable が D3D10_RASTERIZER_DESC で TRUE) および深度値を書き込む時は (ピクセル シェーダーを使用)、書き出された単一の値も 深度テスト で使用されるため、マルチサンプリング時にプリミティブ エッジを高解像度でレンダリングする機能は失われます。
- 動的フロー制御を使用する場合、コンパイル時点では、一部のパスで 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 ハードウェアのユーザー クリップ プレーン」を参照してください。