DirectX 11テンプレートテスト


テンプレートテスト


1.テンプレートテストの実現過程


前述したように、テンプレートバッファを使用して、ピクセルクリップがバックグラウンドバッファの一部の領域にレンダリングされないようにすることができます.特定の画素がバックグラウンドバッファに書き込むことができるかどうかを判断する動作をテンプレートテスト(stencil test)と呼び、その実現過程は以下の通りである.
if( StencilRef & StencilReadMask  ⊴  Value &StencilReadMask)
    accept pixel
else
    reject pixel

テンプレートテストは、ピクセルのラスタリング(つまり、出力合成フェーズ)で行います.テンプレート機能が有効になっている場合、各ラスタライズされたピクセルは、次の2つのオペランドとテンプレートテストを行います.
1.左オペランド(LHS)は、アプリケーションによって指定されたテンプレート参照値(StencilRef)とテンプレートマスク(StencilReadMask)によってビットと演算される.
2.右オペランド(RHS)は、現在の画素のテンプレートバッファにおける対応する値(Value)と、1つのテンプレートマスク(StencilReadMask)とによりビットアンドプレイされる.
LHSとRHSのStencilReadMaskは同じであることに注意してください.
次に、アプリケーションで指定した比較関数⊴でLHSとRHSを比較し、trueまたはfalseを返します.テスト結果がtrueの場合、ピクセルはバックグラウンドバッファに書き込むことができることを示します(深さテストも合格したと仮定します).テスト結果がfalseの場合、バックグラウンドバッファに書き込まないように画素を破棄すべきであることを示します.もちろん、1つのピクセルがテンプレートテストに合格しなかった場合、その深さ値も深さバッファに書き込まれません.
演算子⊴はD 3 D 11_であってもよいCOMPARISON_FNC列挙タイプ定義のいずれかの関数:
typedef enum D3D11_COMPARISON_FUNC
{
    D3D11_COMPARISON_NEVER = 1,
    D3D11_COMPARISON_LESS = 2,
    D3D11_COMPARISON_EQUAL = 3,
    D3D11_COMPARISON_LESS_EQUAL = 4,
    D3D11_COMPARISON_GREATER = 5,
    D3D11_COMPARISON_NOT_EQUAL = 6,
    D3D11_COMPARISON_GREATER_EQUAL = 7,
    D3D11_COMPARISON_ALWAYS = 8,
} D3D11_COMPARISON_FUNC;

1.D3D11_COMPARISON_NEVER:常にfalseを返します.
2.D3D11_COMPARISON_LESS:⊴の代わりに<演算子を使用します.
3.D3D11_COMPARISON_EQUAL:⊴の代わりに==演算子を使用します.
4.D3D11_COMPARISON_LESS_EQUAL:⊴の代わりに≦演算子を使用します.
5.D3D11_COMPARISON_GREATER:⊴の代わりに>演算子を使用します.
6.D3D11_COMPARISON_NOT_EQUAL:使う!=演算子は、
7.D3D11_COMPARISON_GREATER_EQUAL:⊴の代わりに≧演算子を使用します.
8.D3D11_COMPARISON_ALWAYS:常にtrueを返します.