ID3D12GraphicsCommandList1::SetSamplePositions メソッド (d3d12.h)
このメソッドは、後続の描画、コピー、解決、および同様の操作で使用されるサンプル位置を構成します。
構文
void SetSamplePositions(
[in] UINT NumSamplesPerPixel,
[in] UINT NumPixels,
[in] D3D12_SAMPLE_POSITION *pSamplePositions
);
パラメーター
[in] NumSamplesPerPixel
型: UINT
SAL: In
ピクセルごとに取得するサンプルの数を指定します。 この値には 1、2、4、8、または 16 を指定できます。それ以外の場合、SetSamplePosition 呼び出しは破棄されます。 サンプルの数は、描画時に PSO で構成されたサンプル数と一致する必要があります。それ以外の場合、動作は未定義です。
[in] NumPixels
型: UINT
SAL: In
サンプル パターンを指定するピクセル数を指定します。 この値には 1 または 4 を指定できます。それ以外の場合、SetSamplePosition 呼び出しは破棄されます。 値が 1 の場合、各ピクセルに使用する 1 つのサンプル パターンが構成されます。値 4 は、レンダー ターゲットまたはビューポート空間上で繰り返される 2x2 ピクセル グリッド内の各ピクセルに対して個別のサンプル パターンを構成し、偶数座標に揃えます。
結合されたサンプルの最大数は 16 を超えることはできません。それ以外の場合、呼び出しは破棄されます。 NumPixels が 4 に設定されている場合、NumSamplesPerPixel は 4 つ以下のサンプルを指定できます。
[in] pSamplePositions
SAL: In_reads(NumSamplesPerPixel*NumPixels)
D3D12_SAMPLE_POSITION要素の配列を指定します。 配列のサイズは NumPixels * NumSamplesPerPixel です。 NumPixels が 4 に設定されている場合、サンプル位置の最初のグループは、ピクセルの 2x2 グリッド内の左上のピクセルに対応します。次のサンプル位置のグループは、右上のピクセル、次のグループを左下のピクセル、最後のグループを右下のピクセルに対応します。
レンダリング中に重心補間を使用する場合、各ピクセルの位置の順序によって重心サンプリングの優先順位が決まります。 つまり、指定した順序で最初にカバーされるサンプルが重心サンプルの場所として選択されます。
戻り値
なし
解説
サンプル位置の操作セマンティクスは、さまざまな描画、コピー、解決、および発生する可能性のあるその他の操作によって決まります。
CommandList: CommandList で SetSamplePositions が以前に呼び出されていない場合、サンプルではパイプライン状態オブジェクト (PSO) に基づいて既定の位置が想定されます。 既定の位置は、PSO のSAMPLE_DESC部分が存在する場合は標準のサンプル位置、PSO のRASTERIZER_DESC部分の ForcedSampleCount が 0 より大きい値に設定されている場合は標準のサンプル位置によって決定されます。
SetSamplePosition が呼び出された後、後続の描画呼び出しでは、PSO のSAMPLE_DESC部分を使用するか、PSO のRASTERIZER_DESC部分で ForcedSampleCount を使用して、一致するサンプル数を指定する PSO を使用する必要があります。
SetSamplePositions は、グラフィックス CommandList でのみ呼び出すことができます。 バンドルで呼び出すことはできません。バンドルは、呼び出し元の CommandList からサンプルの位置状態を継承し、変更しません。
SetSamplePositions(0, 0, NULL) を呼び出すと、サンプルの位置が既定値に戻ります。
RenderTarget のクリア: レンダー ターゲットをクリアする場合、サンプルの位置は無視されます。
Clear DepthStencil: 深度ステンシル サーフェスまたはその任意の領域の深度部分をクリアする場合、サンプルの位置は、将来のレンダリングの位置とクリアされたサーフェスまたは領域に一致するように設定する必要があります。異なるサンプル位置を使用して生成された不明な領域の内容は未定義になります。
深度ステンシル サーフェスまたはその領域のステンシル部分をクリアする場合、サンプルの位置は無視されます。
RenderTarget に描画する: レンダー ターゲットに描画する場合、前の描画呼び出しと重なる領域に描画する場合でも、描画呼び出しごとにサンプル位置を変更できます。 現在のサンプル位置は、各描画呼び出しの操作セマンティクスを決定し、サンプルは、異なるサンプル位置を使用してコンテンツが生成された場合でも、レンダー ターゲットの格納されたコンテンツから取得されます。
DepthStencil を使用して描画する: 深度ステンシル サーフェス (読み取りまたは書き込み) またはその領域に描画する場合は、以前に影響を受けた領域をクリアするために使用したものと一致するようにサンプルの位置を設定する必要があります。 別のサンプル位置を使用するには、最初にターゲット領域をクリアする必要があります。 クリア領域の外側のピクセルは影響を受けません。
ハードウェアは、深度部分または深度ステンシルサーフェスを平面数式として格納し、アプリケーションが読み取りを発行したときに深度値を生成するように評価できます。 深度ステンシル サーフェスの深度部分のプログラム可能なサンプル位置をサポートするには、ラスタライザーと出力マージャーのみが必要です。 サンプル位置を設定してレンダリングされた深度部分の他の読み取りまたは書き込みでは、それらを無視し、代わりに標準位置でサンプリングできます。
RenderTarget を解決する: レンダー ターゲットまたはその領域を解決する場合、サンプルの位置は無視されます。これらの API は、格納されている色の値に対してのみ動作します。
DepthStencil を解決する: 深度ステンシル サーフェスまたはその領域の深度部分を解決する場合、サンプルの位置は、過去のレンダリングの位置と解決されたサーフェスまたは領域に一致するように設定する必要があります。 別のサンプル位置を使用するには、最初にターゲット領域をクリアする必要があります。
深度ステンシル サーフェスまたはその領域のステンシル部分を解決する場合、サンプルの位置は無視されます。ステンシル解決は、保存されているステンシル値でのみ動作します。
RenderTarget のコピー: レンダー ターゲットからコピーする場合、サンプルの位置は、完全コピーか部分コピーかに関係なく無視されます。
Copy DepthStencil (Full Subresource): 深度ステンシル サーフェスから完全なサブリソースをコピーする場合は、ソース サーフェスの生成に使用されるサンプル位置と一致するようにサンプルの位置を設定する必要があります。 別のサンプル位置を使用するには、最初にターゲット領域をクリアする必要があります。
ソース サーフェスの一部のハードウェア プロパティ (深度値の格納された平面数式など) は、変換先に転送されます。 したがって、ターゲット サーフェスが後で に描画される場合は、ソース コンテンツの生成に最初に使用されたサンプル位置をターゲット サーフェスと共に使用する必要があります。 API では、一部にのみ適用される可能性がある場合でも、一貫性を保つすべてのハードウェアでこれを必要とします。
DepthStencil のコピー (部分サブリソース): 深度ステンシル サーフェスから部分サブリソースをコピーする場合は、完全なサブリソースのコピーと同様に、ソース サーフェスの生成に使用されるサンプル位置と一致するようにサンプル位置を設定する必要があります。 ただし、影響を受けるコピー先サブリソースの内容がコピーの一部しかカバーされていない場合、コピー ソースと同じサンプル位置を使用してすべてのサブリソースが生成されない限り、それらのサブリソース内の未解決部分の内容は未定義になります。 別のサンプル位置を使用するには、最初にターゲット領域をクリアする必要があります。
深度ステンシル サーフェスのステンシル部分から部分サブリソースをコピーする場合、サンプルポストは無視されます。 コピーの対象になっていないコピー先バッファーの他の領域のコンテンツを生成するために使用されたサンプル位置は関係ありません。これらの内容は有効なままです。
Shader SamplePos: HLSL SamplePos 組み込みでは、プログラム可能なサンプル位置が認識されず、プログラム可能な位置でレンダリングされたサーフェスでこれを呼び出すシェーダーに返される結果は未定義です。 アプリケーションは、必要に応じて手動でシェーダーに座標を渡す必要があります。 同様に、サンプル インデックスによる属性の評価は、プログラム可能なサンプル位置では未定義です。
DEPTH_READまたはDEPTH_WRITE状態から切り替えます。 DEPTH_READまたはDEPTH_WRITE状態のサブリソースが、COPY_SOURCEやRESOLVE_SOURCEを含む他の状態に移行された場合は、一部のハードウェアでサーフェスを展開する必要がある場合があります。 したがって、ソース サーフェスでコンテンツを生成するために使用されるものと一致するように、サンプルの位置をコマンド リストに設定する必要があります。 さらに、同じ深度データが残っているサーフェスの後続の遷移では、サンプルの位置はコマンド リストで設定されているものと一致し続ける必要があります。 別のサンプル位置を使用するには、最初にターゲット領域をクリアする必要があります。
アプリケーションで、一部のみを使用する必要がある場合に圧縮解除領域を最小限に抑える場合、または圧縮を保持するだけの場合は、rect を指定して DECOMPRESS モードで ResolveSubresourceRegion() を呼び出すことができます。 これにより、関連する領域だけが別のリソースに展開され、一部のハードウェアではソースはそのまま残りますが、他のハードウェアではソース領域も展開されます。 その後、明示的に展開された個別のリソースを目的の状態 (SHADER_RESOURCE など) に移行できます。
RENDER_TARGET状態からの移行: RENDER_TARGET状態のサブリソースがCOPY_SOURCEまたはRESOLVE_SOURCE以外のものに移行された場合は、一部の実装でサーフェスを展開する必要がある場合があります。 この圧縮解除は、サンプル位置に依存しません。
アプリケーションで、一部のみを使用する必要がある場合に圧縮解除領域を最小限に抑える場合、または圧縮を保持するだけの場合は、rect を指定して DECOMPRESS モードで ResolveSubresourceRegion() を呼び出すことができます。 これにより、関連する領域だけが別のリソースに展開され、一部のハードウェアではソースはそのまま残りますが、他のハードウェアではソース領域も展開されます。 その後、明示的に展開された個別のリソースを目的の状態 (SHADER_RESOURCE など) に移行できます。
要件
要件 | 値 |
---|---|
対象プラットフォーム | Windows |
ヘッダー | d3d12.h |
Library | D3d12.lib |
[DLL] | D3d12.dll |