概要ステンシルはピクセル単位で参照値と呼ばれる値を設定し、その値に基づいてピクセルの描画を行うかどうかは判断する描画手法のことです。ステンシルを使用すればオブジェクト部分のみをくりぬいた描画を行う事などができます。参照値を使用したテストをステンシルテストと呼ばれています。実用例ステンシルを使用すれば以下のように壁にシルエットが写っているような演出を行うことも可能です。ステンシルバッファステンシルバッファは参照値を保存するためのバッファです。基本的に描画対象となるフレームバッファと同じ大きさを用意します。各ピクセルに対して割り当てられているサイズは設定で変更できますが1バイトのケースが多いです。1バイトの場合は0~255までの256段階の参照値の設定が可能ということになります。DirectX9ではZバッファのメモリとステンシルバッファのメモリは同じ領域に用意されています。ステンシルテストステンシルテストはフレームバッファに新しく描き込むピクセルの参照値とステンシルバッファの参照値を利用して行う描き込み判定処理のことです。参照値ステンシルテストは新しく描画を行う予定のピクセルの参照値とステンシルバッファの参照値を使用して比較を行います。マスクステンシルバッファ側の参照値はピクセルの参照値と比較する前にマスクをかけることができるので、バッファ側の参照値をコントロールしてテストを行うことが可能です。B」等といったプログラムでよく使用する方法で行います。失敗」させることも可能です。結果ステンシルはステンシルテストの結果とZテストの結果の組み合わせで、ステンシルバッファへ反映するかどうかを決めることができます。DX9によるステンシルの実装方法DirectX9を使用したステンシル処理の実装方法紹介します。プレゼントパラメータの設定を変更するステンシル機能を使用するためにはDirectGraphicsのデバイスを生成する際に使用するプレゼントパラメータの設定が必要です。D3DFMT_D24S8;ステンシルの設定では「EnableAutoDepthStencil」と「AutoDepthStencilFormat」の値を変更します。EnableAutoDepthStencilはステンシル、デプス機能を有効する変数で、AutoDepthStencilFormatはステンシルとデプスのバッファフォーマットを決める変数です。今回の「D3DFMT_D24S8」はバッファの1つのデータを32ビットで扱い、デプスが24ビット、ステンシルが8ビットで管理する設定になります。ステンシルバッファをクリアDirectX9ではフレームバッファのクリアを行っているClear関数がありますが、そこで、ステンシルバッファのクリアも行います。ステンシルバッファの初期値ステンシルバッファ側の設定ステンシルでは型抜きの役割をするステンシルバッファの設定とその型を使ってオブジェクトを描画する場合では設定が異なるので、まずはステンシルバッファ側(型抜き側)の設定から紹介します。※今回のステンシルバッファの設定は描画を行わず、ステンシルバッファに書き込む方法の紹介です。Zテストの設定マスク側のZテストの設定は「テストを有効にする」「テストを必ず失敗させる」を行います。テストを有効にするステンシルにはZテストが必要となりますので、Zテストを有効にします。TRUE);Zテストを必ず失敗させるマスクはフレームバッファに反映させる必要はありません。Zテストの設定を必ず失敗するようにして、ステンシルバッファにだけテスト結果を反映させるようにします。D3DCMP_NEVER);ステンシル設定マスク側のステンシル設定は以下のようになります。テストを有効にするステンシルテストが当然ながら必要となりますので、有効にします。TRUE);ステンシルバッファへ反映する参照値設定マスクの値としてステンシルバッファへ反映する参照値を指定します。0x01);参照値マスクの設定テストを行う際のステンシルバッファの参照値に対するマスクの値を指定します。何も行わない場合は0xff等、ビットが削られない設定を行います。0xff);ステンシルテストの判定方法設定ステンシルテストの合否判定のための判定方法を決めます。以下のコードで使用している「D3DCMP_ALWAYS」は必ず成功する設定です。最後にステンシル、Zテストの結果の組み合わせと、その場合の反映方法を設定します。「D3DSTENCILOP_REPLACE」はピクセル側の参照値で置き換える設定です。設定が完了したら、その後は通常の描画を行います。この描画されるオブジェクトの内容がステンシルテストの対象となり、バッファに書き込まれます。実際には描画されているオブジェクトがマスクの役割を兼用することもあります。サンプルのPractice02関数ではマップチップをマスクとして扱っています。ステンシル設定マスクが反映されたステンシルバッファの内容に影響を受けるためには以下の設定を行います。Zテスト設定ステンシルのマスクでZテストを全て失敗設定にしているので、Zテストを有効にした上でテスト方法を再指定します。D3DCMP_LESSEQUAL);ステンシルテスト設定ステンシルテスト側の設定はマスク側の設定とあまり変わりませんのでコードを先に紹介して異なる部分を解説します。D3DSTENCILOP_KEEP);設定の値が異なっているのは「比較方法」と「反映の設定」の箇所です。比較方法ステンシル側の比較方法は「D3DCMP_EQUAL」を使用しています。これはピクセル側の参照値とステンシルバッファの参照値の値が同じならば成功となる設定です。別の反映方法の場合は、参照値は変化することが多いです。反映の設定はステンシル、Zテストともに成功した場合のみ、ピクセルの参照値をステンシルバッファに反映することを許可しています。設定が完了したら、その後は通常の描画を行います。この描画されるオブジェクトの内容がステンシルテストの対象となり、バッファに書き込まれます。探している内容が見つからなかったら以下のサイトにあるかもしれません。筆者が開発にかかわらせてもらったアプリのリンクです。