2012-03-12 14 views
4

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

例えば

:その後、私はに描きたい

multiple regions

: 私は2つの長方形のこのようなステンシルを持って

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

がステンシルバッファの異なるビットに複数のステンシルを宣言することが可能であるが、私は方法がわからないことを私を発見しました。 これを動作させるにはどうすればglStencilOpglStencilFuncを設定しますか?

または、それにはglScissorを使用する必要がありますか?

+1

それらが常に長方形であれば、「glScissor」は良いアイデアですが、確かに5では機能しません。 –

答えて

2

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

関連する問題