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

型: D3D12_SAMPLE_POSITION*

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) を呼び出すと、サンプル位置が既定値に戻ります。

Clear RenderTarget: レンダー ターゲットをクリアすると、サンプルの位置は無視されます。

Clear DepthStencil: 深度ステンシル サーフェスまたはその任意の領域の深度部分をクリアする場合、サンプル位置は、将来のレンダリングの位置とクリアされたサーフェスまたは領域に一致するように設定する必要があります。異なるサンプル位置を使用して生成された不明な領域の内容は未定義になります。

深度ステンシル サーフェスまたはその領域のステンシル部分をクリアすると、サンプルの位置は無視されます。

RenderTarget に描画する: レンダー ターゲットに描画する場合、前の描画呼び出しと重なる領域に描画する場合でも、描画呼び出しごとにサンプル位置を変更できます。 現在のサンプル位置は、各描画呼び出しの操作セマンティクスを決定し、サンプルは、異なるサンプル位置を使用してコンテンツが生成された場合でも、レンダー ターゲットの格納されたコンテンツから取得されます。

DepthStencil を使用して描画する: 深度ステンシル サーフェス (読み取りまたは書き込み) またはその任意の領域に描画する場合は、影響を受けた領域を以前にクリアするために使用したものと一致するようにサンプル位置を設定する必要があります。 別のサンプル位置を使用するには、先にターゲット領域をクリアする必要があります。 クリア領域の外側のピクセルは影響を受けません。

ハードウェアは、深度部分または深度ステンシル サーフェスを平面方程式として格納し、アプリケーションが読み取りを発行したときに深度値を生成するように評価できます。 深度ステンシル サーフェスの深度部分のプログラム可能なサンプル位置をサポートするには、ラスタライザーと出力マージャーのみが必要です。 サンプル位置を設定してレンダリングされた深度部分のその他の読み取りまたは書き込みは無視して、代わりに標準位置でサンプリングできます。

RenderTarget の解決: レンダー ターゲットまたはその任意の領域を解決する場合、サンプルの位置は無視されます。これらの API は、格納されている色の値でのみ動作します。

DepthStencil を解決する: 深度ステンシル サーフェスまたはその任意の領域の深度部分を解決する場合、サンプルの位置は、過去のレンダリングの位置と解決されたサーフェスまたは領域に一致するように設定する必要があります。 別のサンプル位置を使用するには、先にターゲット領域をクリアする必要があります。

深度ステンシル サーフェスまたはその領域のステンシル部分を解決する場合、サンプル位置は無視されます。ステンシル解決は、格納されているステンシル値に対してのみ動作します。

RenderTarget のコピー: レンダー ターゲットからコピーする場合、完全コピーか部分コピーかに関係なく、サンプル位置は無視されます。

DepthStencil のコピー (フル サブリソース): 深度ステンシル サーフェスから完全なサブリソースをコピーする場合は、ソース サーフェスの生成に使用されるサンプル位置と一致するようにサンプル位置を設定する必要があります。 別のサンプル位置を使用するには、先にターゲット領域をクリアする必要があります。

ソース サーフェスの一部のハードウェア プロパティ (深度値の格納された平面方程式など) は、変換先に転送されます。 したがって、先のサーフェスが後で描画される場合、ソース コンテンツを生成するために最初に使用されるサンプル位置は、宛先サーフェスと共に使用する必要があります。 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

こちらもご覧ください

ID3D12GraphicsCommandList1