sample (sm4 - asm)
指定したアドレスと、指定されたサンプラーによって識別されるフィルター モードを使用して、指定された要素/テクスチャのデータをサンプリングします。
sample[_aoffimmi(u,v,w)] dest[.mask], srcAddress[.swizzle], srcResource[.swizzle], srcSampler |
---|
項目 | 説明 |
---|---|
Dest |
[入力]操作の結果のアドレス。 |
srcAddress |
[入力]テクスチャ座標のセット。 詳細については、「解説」を参照してください。 |
srcResource |
[入力]テクスチャ レジスタ。 詳細については、「解説」を参照してください。 |
srcSampler |
[入力]サンプラー レジスタ。 詳細については、「解説」を参照してください。 |
解説
ソース データは、バッファー以外の任意のリソースの種類から取得できます。
srcAddress は、テクスチャ内の正規化された空間を参照する浮動小数点値として、サンプルの実行に必要なテクスチャ座標のセットを提供します。 [0...1] 範囲外のテクスチャ座標に対してアドレス ラッピング モード (ラップ/ミラー/クランプ/罫線など) が適用され、サンプラーの状態 (s#) から取得され、アドレス オフセットがテクスチャ座標に適用された後に適用されます。
srcResource はテクスチャ レジスタ (t#) です。 これは、サンプリングされるリソースの戻りデータ型を含む、テクスチャのプレースホルダーにすぎません。 この情報はすべて、シェーダー プリアンブルで宣言されています。 サンプリングされる実際のリソースは、スロット # (t# の場合) でシェーダーに外部からバインドされます。
srcSampler はサンプラー レジスタです。 これは、ポイントコントロールとリニアコントロール、mipmappingコントロール、アドレスラップコントロールなどのフィルタリングコントロールのコレクションのプレースホルダーです。
ハードウェアがサンプリングを実行するために必要な情報のセットは、2 つの直交部分に分割されます。 まず、テクスチャ レジスタは、ソース データ型情報 (たとえば、テクスチャに SRGB データが含まれているかどうかに関する情報) を提供します。 また、サンプリングされる実際のメモリも参照します。 次に、サンプラー レジスタによって、適用するフィルター モードが定義されます。
配列リソース
Texture1D 配列の場合、 srcAddress g コンポーネント (POS-swizzle) によって、フェッチ元の配列スライスが選択されます。 これは、標準テクスチャ座標の正規化された空間ではなく、常にスケーリングされた浮動小数点値として扱われ、値に対して最も近い丸い偶数が適用され、その後に使用可能な BufferArray 範囲にクランプが適用されます。
Texture2D 配列の場合、 srcAddress b コンポーネント (POS-swizzle) は、フェッチ元の配列スライスを選択します。それ以外の場合は、Texture1D Arrays で説明されているのと同じセマンティクスを使用します。
アドレス オフセット
省略可能な [_aoffimmi(u,v,w)] サフィックス (即時整数によるアドレス オフセット) は、サンプルのテクスチャ座標が、指定された一連の即時テクセル空間整数定数値によってオフセットされることを示します。 リテラル値は、整数範囲 [-8,7] を持つ 4 ビット 2 の補数のセットです。 この修飾子は、Texture1D/2D 配列や Texture3D を含むすべてのリソースに対して定義されますが、TextureCube では未定義です。
ハードウェアは、共通の場所に関するテクセルの一部のフットプリントに対するトラバーサルが一連のサンプル命令によって実行されているという即時の知識を利用できます。 これは、_aoffimmi (u,v,w) を使用して伝達できます。
オフセットは、アクセスされる各 miplevel に対して、テクセル空間内のテクスチャ座標に追加されます。 したがって、テクスチャ座標は正規化された浮動小数点値として提供されますが、オフセットはテクセル空間の整数オフセットを適用します。
アドレス オフセットは、Texture1D/2D 配列の配列軸に沿って適用されません。
_aoffimmi v,w コンポーネントは Texture1D では無視されます。
_aoffimmi w コンポーネントは Texture2D では無視されます。
サンプラーの状態 (s#) からのアドレス ラッピング モード (ラップ/ミラー/クランプ/罫線など) は、テクスチャ座標にアドレス オフセットが適用された後に適用されます。
戻り値の型コントロール
サンプルによって宛先レジスタに返されるデータ形式は、 srcResource パラメーター (t#) にバインドされたリソース形式 (DXGI_FORMAT*) によって決まります。 たとえば、指定された t# がDXGI_FORMAT_A8B8G8R8_UNORM_SRGB形式のリソースにバインドされている場合、サンプリング操作では、サンプリングされたテクセルがガンマ 2.0 から 1.0 に変換され、フィルター処理が適用され、結果が [0..1] の範囲の浮動小数点値として変換先レジスタに書き込まれます。
返される値は 4 ベクトルです (形式に存在しないコンポーネントの形式固有の既定値)。 srcResource の swizzle は、テクスチャ サンプル/フィルターから返される 4 コンポーネントの結果をスウィズルする方法を決定します。その後、dest の .mask によって、dest のどのコンポーネントが更新されるかが決まります。
サンプルが 32 ビット浮動小数点値を 32 ビット レジスタに読み込み、ポイント サンプリング (フィルター処理なし) の場合は、非正規値をフラッシュする場合とフラッシュしない場合がありますが、それ以外の場合は数値は変更されません。 ポイント サンプリングの非正規値の不確実性がアプリケーションの問題である場合は、 ld 命令を使用します。これにより、32 ビットの浮動小数点値が変更されていない読み取りが保証されます。
LOD 計算
フィルター処理の LOD を決定するプロセスで派生物を計算する方法の詳細については、「 deriv_rtx と deriv_rty」を参照してください。 サンプル命令では、派生シェーダー命令で使用されるのと同じ定義を使用して、テクスチャ座標の派生関数を暗黙的に計算します。 これは、 sample_l または sample_d の手順には適用されません。 これらの手順では、LOD または派生物がアプリケーションによって直接提供されます。
サンプル命令の場合、実装では、2x2 スタンプ内のすべての 4 ピクセル (ただし大きな領域は含まない) で同じ LOD 計算を共有するか、ピクセル単位の LOD 計算を実行することを選択できます。
その他の詳細
Buffer & Texture1D の場合、 srcAddress .gba コンポーネント (POS-swizzle) は無視されます。 Texture1D 配列の場合、 srcAddress .ba コンポーネント (POS-swizzle) は無視されます。 Texture2D の場合、 srcAddress .a コンポーネント (POS-swizzle) は無視されます。
何もバインドされていない入力スロットからフェッチすると、すべてのコンポーネントに対して 0 が返されます。
制限
- srcResource は t# レジスタである必要があります。 srcResource は ConstantBuffer にすることはできません。これは t# レジスタにバインドできません。
- srcSampler は s# レジスタである必要があります。
- srcResource または srcSampler での相対アドレス指定は許可されていません。
- srcAddress は一時 (r#/x#)、constantBuffer (cb#)、入力 (v#) レジスタ、または即時値である必要があります。
- dest は一時 (r#/x#) または出力 (o*#) レジスタである必要があります。
- TextureCubes では、_aoffimmi(u,v,w) は使用できません。
この命令は、次のシェーダー ステージに適用されます。
頂点シェーダー | ジオメトリ シェーダー | ピクセル シェーダー |
---|---|---|
x |
最小シェーダー モデル
この関数は、次のシェーダー モデルでサポートされています。
シェーダー モデル | サポートされています |
---|---|
シェーダー モデル 5 | はい |
シェーダー モデル 4.1 | はい |
シェーダー モデル 4 | はい |
シェーダー モデル 3 (DirectX HLSL) | no |
シェーダー モデル 2 (DirectX HLSL) | no |
シェーダー モデル 1 (DirectX HLSL) | no |