ステンシルバッファを構成して、それらの間のステンシルバッファを変更せずに上記5つのステップをすべて実行できるかどうかはわかりません。 glStencilOp
がビット単位のORを提供するのは簡単ですが、そうではなく、増分または減分を使用するだけで、長方形を複数回描く必要があります。
しかし、領域が常に矩形である場合、シザーテストを使用するだけではどうですか?最初の3つのステップ(実際には2と3)は、矩形の領域をglScissor
に設定し、シザーテスト(glEnable(GL_SCISSOR_TEST)
)を有効にするだけで実行できます。
あなた自身を矩形と再び、シザーテストを使用紫色の交差点を計算するか、あなたはステンシルテストを使用して中央の1(ステップ4)については
:
glEnable(GL_STENCIL_TEST);
glStencilFunc(/*whatever*/);
glStencilOp(GL_INCR, GL_INCR, GL_INCR); //increase the stencil value
//draw both rectangles
glStencilFunc(GL_EQUAL, 2, 0xFFFFFFFF); //only draw where both rectangles are
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); //don't change the stencil buffer
//draw things
だから我々は最初の両方の長方形を描き、増加ステンシル値はどこでも描画されます。そして、ステンシルの値が2であるところのすべてのものを描画します。つまり、両方の長方形が描かれています。あなたは同じステンシルバッファを使用する第五ステップのために
が、2番目のパスのための
glStencilFunc(GL_LEQUAL, 1, 0xFFFFFFFF);
と。こうすることで、ステンシルバッファが少なくとも1つ、つまり少なくとも1つの矩形が描かれた場所に何かを描くことができます。
3つ以上の長方形の場合は、より複雑になる可能性があり、最適な方法を見つけるためにちょっと遊んでみる必要があります。
それらが常に長方形であれば、「glScissor」は良いアイデアですが、確かに5では機能しません。 –