次の方法で共有


ステンシル バッファーの手法 (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))

ピクセル パイプライン