次の方法で共有


ステンシル バッファー手法 (Direct3D 9)

アプリケーションでは、ステンシル バッファーを使用してイメージ内のピクセルをマスクします。 マスクは、ピクセルを描画するかどうかを制御します。 より一般的な効果の一部を以下に示します。

ステンシル バッファーは、レンダリング ターゲット サーフェスへの描画をピクセル単位で有効または無効にします。 最も基本的なレベルでは、アプリケーションでレンダリングされたイメージのセクションをマスクして、表示されないようにすることができます。 多くの場合、アプリケーションでは、ディゾルブ、デカール、アウトラインなどの特殊効果にステンシル バッファーが使用されます。

ステンシル バッファー情報は、z バッファー データに埋め込まれます。 次のコード例に示すように、アプリケーションで IDirect3D9::CheckDeviceFormat メソッドを使用して、ハードウェア ステンシルのサポートを確認できます。

// Reject devices that cannot perform 8-bit stencil buffering. 
// The following example assumes that pCaps is a valid pointer 
// to an initialized D3DCAPS9 structure. 

if( FAILED( m_pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal,
                                       pCaps->DeviceType,  
                                       Format,  
                                       D3DUSAGE_DEPTHSTENCIL, 
                                       D3DRTYPE_SURFACE,
                                       D3DFMT_D24S8 ) ) )
return E_FAIL;

IDirect3D9::CheckDeviceFormat を使用すると、そのデバイスの機能に基づいて作成するデバイスを選択できます。 この場合、8 ビット ステンシル バッファーをサポートしていないデバイスは拒否されます。 これは、IDirect3D9::CheckDeviceFormatで使用可能な 1 つのみであることに注意してください。詳細については、ハードウェア サポートの決定 (Direct3D 9)を参照してください。

ステンシル バッファーのしくみ

Direct3D は、ステンシル バッファーの内容に対してピクセル単位でテストを実行します。 ターゲット サーフェス内の各ピクセルについて、ステンシル バッファー内の対応する値、ステンシル参照値、およびステンシル マスク値を使用してテストを実行します。 テストに合格すると、Direct3D はアクションを実行します。 テストは、次の手順を使用して実行されます。

  1. ステンシル マスクを使用してステンシル参照値のビットごとの AND 演算を実行します。
  2. ステンシル マスクを使用して、現在のピクセルのステンシル バッファー値のビットごとの AND 演算を実行します。
  3. 比較関数を使用して、ステップ 1 の結果をステップ 2 の結果と比較します。

これらの手順を次のコード例に示します。

(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
StencilBufferValue

は、現在のピクセルのステンシル バッファーの内容です。 このコード例では、アンパサンド (&) 記号を使用してビットごとの AND 演算を表します。

StencilMask

はステンシル マスクの値を表し、

StencilRef

はステンシル参照値を表します。

CompFunc

は比較関数です。

ステンシル テストに合格すると、現在のピクセルがターゲット サーフェスに書き込まれ、それ以外の場合は無視されます。 既定の比較動作では、各ビットごとの演算が (D3DCMP_ALWAYS) どのように発生しても、ピクセルを書き込みます。 この動作を変更するには、D3DRS_STENCILFUNCのレンダリング状態の値を変更し、D3DCMPFUNC 列挙型のメンバーを渡して目的の比較関数を識別します。

アプリケーションでは、ステンシル バッファーの操作をカスタマイズできます。 比較関数、ステンシル マスク、ステンシル参照値を設定できます。 ステンシル テストが成功または失敗したときに Direct3D が実行するアクションを制御することもできます。 詳細については、「ステンシル バッファーの状態 (Direct3D 9)」を参照してください。

次のコード例は、ステンシル バッファーの設定を示しています。

// Enable stencil testing
pDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE);

// Specify the stencil comparison function
pDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL);

// Set the comparison reference value
pDevice->SetRenderState(D3DRS_STENCILREF, 0);

//  Specify a stencil mask 
pDevice->SetRenderState(D3DRS_STENCILMASK, 0);

既定では、ステンシル参照値は 0 です。 任意の整数値が有効です。 Direct3D は、ステンシル テストの前にステンシル参照値とステンシル マスク値のビットごとの AND を実行します。

ステンシルの比較に応じて、書き出されるピクセル情報を制御できます。

// A write mask controls what is written
pDevice->SetRenderState(D3DRS_STENCILWRITEMASK, D3DSTENCILOP_KEEP);
// Specify when to write stencil data
pDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);

次の例に示すように、ステンシル バッファーに書き込む値の独自の数式を記述できます。

NewStencilBufferValue = (StencilBufferValue & ~StencilWriteMask) | 
                        (StencilWriteMask & StencilOp(StencilBufferValue))

ピクセル パイプライン