現時点では、ステンシルバッファ間でステンシルバッファを変更せずに、上記の5つの手順すべてを実行できるようにステンシルバッファを構成できるかどうかはわかりません。glStencilOp
ビット単位のORを指定すると簡単ですが、そうではなく、インクリメントまたはデクリメントを使用するだけで、長方形を複数回描画する必要があります。
しかし、領域が常に長方形である場合は、はさみテストを使用してみませんか?したがって、最初の3つのステップ(または実際には2と3)は、長方形の領域をで設定しglScissor
、はさみテストを有効にするだけで実行できます(glEnable(GL_SCISSOR_TEST)
)。
真ん中の場合(ステップ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のすべての場所に物を描画します。これは、両方の長方形が描画されたことを意味します。
5番目のステップでは、同じステンシルバッファーを使用しますが、
glStencilFunc(GL_LEQUAL, 1, 0xFFFFFFFF);
2回目のパス。このようにして、ステンシルバッファが少なくとも1であるすべての場所に何かを描画します。これは、少なくとも1つの長方形が描画されたことを意味します。
2つ以上の長方形の場合、それはより複雑になる可能性があり、最適な方法を見つけるために少し遊んでみる必要があります。