Share via


ステンシル バッファ テクニック

ステンシル バッファ テクニック

ステンシル バッファを使えば、アプリケーションは画像のピクセルをマスクできる。このマスクは、ピクセルを描画するかどうかを制御する。ここでは、頻繁に使われる次のエフェクトについて説明する。

ステンシル バッファは、レンダリング ターゲット サーフェイスのピクセル単位の描画を有効または無効にする。このバッファの最も基本的なレベルでは、アプリケーションがレンダリングした画像の部分をマスクで覆うことが可能になり、その画像が表示されない。アプリケーションはディゾルブ、デカール、アウトライニングなどの特殊効果のためにステンシル バッファを使うことが多い。

ステンシル バッファ情報は、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 つにすぎない。詳細については、「ハードウェア サポートの判定」を参照すること。

ステンシル バッファの動作

Microsoft® Direct3D® は、ステンシル バッファの内容をピクセル単位で調べる。ステンシル バッファの対応する値、ステンシル参照値、ステンシル マスク値を使って、ターゲット サーフェイスの各ピクセルに対するテストを行う。テストにパスすると、Direct3D はアクションを実行する。このテストは次のステップで実行される。

  1. ステンシル参照値とステンシル マスクのビット積 (AND) 演算を実行する。
  2. カレント ピクセルに対するステンシル バッファ値とステンシル マスクのビット積 (AND) 演算を実行する。
  3. 比較関数を使って、ステップ 1 とステップ 2 の結果を比較する。

これらのステップを次の例で示す。

(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)

ここで、StencilBufferValue は、カレント ピクセルに対するステンシル バッファの内容である。このコードでは、アンパサンド (&) 記号はビット積 (AND) 演算を表している。StencilMask はステンシル マスク、StencilRef はステンシル参照値を表している。CompFunc は比較関数である。

このステンシル テストにパスすると、カレント ピクセルはターゲット サーフェイスに書き込まれるが、失敗した場合は無視される。デフォルトの比較処理では、各ビット演算の結果に関係なく、ピクセルが書き込まれる (D3DCMP_ALWAYS)。この動作を変更するには、目的の比較関数を指定する D3DCMPFUNC 列挙型のメンバを渡して、D3DRS_STENCILFUNC レンダリング ステートの値を変更する。

アプリケーションでは、ステンシル バッファの処理をカスタマイズできる。アプリケーションでは、比較関数、ステンシル マスク、ステンシル参照値を設定できる。また、ステンシル テストにパスした場合または失敗した場合に実行する Direct3D の処理を制御することもできる。詳細については、「ステンシル バッファ ステート」を参照すること。