5

OpenGLで複数のステンシルを設定してから、それらの複数の組み合わせを描画したいと思います。

例:次のような2つの長方形のステンシルがあります。

複数の地域

それから私は引き込みたいです:

  1. どこでも
  2. 左の長方形(青+紫)
  3. 右の長方形(紫+赤)
  4. 真ん中の長方形(紫)
  5. 全体の色の領域(青+紫+赤)

ステンシルバッファの異なるビットで複数のステンシルを宣言することが可能であることがわかりましたが、その方法がわかりません。セットアップ方法glStencilOpglStencilFuncこれを機能させるにはどうすればよいですか?

それとも私glScissorはそのために使うことができますか?

4

1 に答える 1

2

現時点では、ステンシルバッファ間でステンシルバッファを変更せずに、上記の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つ以上の長方形の場合、それはより複雑になる可能性があり、最適な方法を見つけるために少し遊んでみる必要があります。

于 2012-03-12T13:32:30.370 に答える