OpenTKOpenTKがGitHubで更新されるようになりました。NuGetから手に入れることができるようになりました。Coreに対応する機運があるようです。ステンシルテスト型紙ステンシルテストは、アルファテストとデプステストと同じように、ピクセル毎に記憶された値を元にそのピクセルを描画するかを判定しています。ステンシル(プレート)は型紙ですが、OpenGLではルールを設定することで指定したポリゴンを特殊な型紙として扱うことができます。デプステストと同じように、ステンシルシャドウという影(Shadow)を描画する方法の一つに使われることもあります。球の奥が見えるソースコードにはステンシルテストの設定が追加され、これを確認できるように型紙用の球を追加しています。//800x600のウィンドウを作る。Test")OpenTKのクラスが生成する画面は、初期状態ではステンシルバッファ(書き込む場所)のサイズが0になっているので、GraphicsModeを使って指定する必要があります。気にしていないと指定し忘れるかもしれないので注意してください。//ステンシルテストGL.Enable(EnableCap.StencilTest);GL.ClearStencil(0);GL.StencilMask(~0);まずは起動時に、ステンシルテストを許可します。次に、ステンシル値をリセットしたときの初期値をClearStencilで設定します。0x00なので、全てが'1'のビット列)。ちなみに、この例ではどちらとも初期値を設定しているので、書かれていない場合もあるはずです。//画面描画で実行される。ClearBufferMask.StencilBufferBit);ここの引数の指定も変わります。最後にStencilBufferBitを追加していて、これでステンシル値が、ClearStencilで指定した値になります。0.0f);sphere.Draw();GL.PopMatrix();SwapBuffers();ColorMaskとDepthMask関数は、バッファに対しての書き込み制御するもので、falseで書き込まない(≒表示しない)、trueで書き込む(≒表示する)となっています。結果の表示のために追加しています。ステンシルテストの処理の設定は主に二つです。StencilOpは、ステンシルテストとデプステストの結果によって、どのような処理をステンシル値に施すかを指定します。各引数は順に、ステンシルテスト不合格、ステンシルテスト合格かつデプステスト不合格、どちらも合格、のときとなっています。StencilFuncは、テストの評価方法を設定します。最初の引数で不等号を、次の引数で基準値を定めます。最後の引数はステンシル値へのマスクです。StencilOpで用いるStencilOp列挙型は下のとおりです。(値はステンシル値のことです。(0を下回ると最大値)ReplaceStencilFuncの第2引数の値とするInvert値のビット列を反転するStencilFuncで用いるStencilFunction列挙型は、デプステストのものと内容は同じです。文だけでは動作を掴みにくいと思うので、図でさらに説明します。すべてを普通に表示した場合この型紙は左右の物体より早く(ステンシルバッファに)描画され、画面の中で型紙があるところのステンシル値が1となります。ちなみに、回転の中心に球の型紙があるので画面の中心のステンシル値は常に1となることになります。通常描画この場合、中心以外のステンシル値は0なので、赤い球は無事描画されます。1ではないので青のトーラスは描画されません。下の床はステンシル値がClearされ0で、関数の最後のStencilFuncの設定が残っているので描画されています。どちらも欠ける状態なんとも奇妙な形ですが、中心以外のステンシル値は0なので、中心以外では赤い球が描画されています。中心のステンシル値は1なので、中心では青いトーラスが描画されています。MasuqaT.NET。