シェーダー指定されたステンシル参照値Shader Specified Stencil Reference Value

API 指定の値を使用するのではなく、ピクセル シェーダーからステンシル参照値を出力できるようにすると、ステンシル操作をきめ細かく制御できます。Enabling pixel shaders to output the Stencil Reference Value, rather than using the API-specified one, enables a very fine granular control over stencil operations.

ステンシル参照値は、通常、 ID3D12GraphicsCommandList:: OMSetStencilRefメソッドによって指定されます。The Stencil Reference Value is normally specified by the ID3D12GraphicsCommandList::OMSetStencilRef method. このメソッドは、描画単位の粒度でステンシル参照値を設定します。This method sets the stencil reference value on a per-draw granularity. ただし、この値はピクセルシェーダーによって上書きされる可能性があります。However, this value can be overwritten by the pixel shader.

この D3D12 (および D3D 11.3) 機能により、開発者は、ピクセルシェーダーから出力されるステンシル参照値 (SV_StencilRef) を読み取り、使用して、ピクセル単位またはサンプル単位の粒度を有効にすることができます。This D3D12 (and D3D11.3) feature enables developers to read and use the Stencil Reference Value (SV_StencilRef) that is output from a pixel shader, enabling a per-pixel or per-sample granularity.

シェーダーによって指定された値は、その呼び出しの API が指定した参照値を置き換えます。つまり、変更はステンシルテストに影響します。また、ステンシル操作 D3D12_ステンシル_OP_置換 (1 つのメンバーのD3D12_ステンシル_op) を使用して、ステンシルバッファーに参照値を書き込みます。The shader specified value replaces the API-specified reference value for that invocation, which means the change affects both the stencil test, and when the stencil operation D3D12_STENCIL_OP_REPLACE (one member of D3D12_STENCIL_OP) is used to write the reference value to the stencil buffer.

この機能は、D3D12 と D3D 11.3 の両方で省略可能です。This feature is optional in both D3D12 and D3D11.3. サポートをテストするには、 Checkfeaturesupportを使用してD3D12_FEATURE_DATA_D3D12_オプションPSSpecifiedStencilRefSupportedブール値フィールドを確認します。To test for its support, check the PSSpecifiedStencilRefSupported boolean field of D3D12_FEATURE_DATA_D3D12_OPTIONS using CheckFeatureSupport.

次に、ピクセルシェーダーでのSV_StencilRefの使用例を示します。Here is an example of the use of SV_StencilRef in a pixel shader:

uint main2(float4 c : COORD) : SV_StencilRef
{
    return uint(c.x);
}

レンダリングRendering

HLSL でのリソース バインドResource Binding in HLSL

シェーダー モデル 5.1Shader Model 5.1

HLSL でのルート署名の指定Specifying Root Signatures in HLSL