2012-07-08 2 views
5

テクスチャからレンダリングの一部を表示するために「ステンシルバッファ」を使用しようとしましたが、レンダーはマスク効果なしで表示されます。iOSでステンシルバッファを使用する

これは私のコードの懸念一部である、2DのiOSプロジェクトのためのOpenGL ES 2.0 です:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
glEnable(GL_STENCIL_TEST); 


// mask rendering 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
glStencilFunc(GL_ALWAYS, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 

glBindTexture(GL_TEXTURE_2D, _maskTexture); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 


// scene rendering 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
glStencilFunc(GL_EQUAL, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 

glBindTexture(GL_TEXTURE_2D, _viewTexture); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

任意の助けをいただければ幸いです!

精度(私の英語のため申し訳ありませんが、フランスの開発者のためにいつものように!):「_maskTextureは」黒&白画像です。


ソリューション:


私はfinnaly rotoglubティムの兆候と私の問題を解決しました。 ありがとうございます。

1 /ステンシルバッファが正しく作成されていません。 このように初期化する必要があります。

glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthStencilRenderbuffer); 
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, 
          GL_DEPTH24_STENCIL8_OES, 
          backingWidth, 
          backingHeight); 

それは私のレンダリングは私のマスクの影響を受けなかった主な理由です。

2 /テクスチャをマスクとして使用するには、黒色をアルファチャンネルに置き換え、レンダリングでブレンドを有効にしました。

私の最終的なレンダリングコードは次のようになります。単純に

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

glVertexPointer(2, GL_FLOAT, 0, vertices); 
glTexCoordPointer(2, GL_FLOAT, 0, texcoords); 

glClearStencil(0); 
glClearColor (0.0,0.0,0.0,1); 
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 


// mask rendering 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
glEnable(GL_STENCIL_TEST); 
glEnable(GL_ALPHA_TEST); 
glBlendFunc(GL_ONE, GL_ONE); 
glAlphaFunc(GL_NOTEQUAL, 0.0); 
glStencilFunc(GL_ALWAYS, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 

glBindTexture(GL_TEXTURE_2D, _mask); 
glDrawArrays(GL_TRIANGLE_STRIP, 4, 4); 

// scene rendering 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
glStencilFunc(GL_EQUAL, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 

glDisable(GL_STENCIL_TEST); 
glDisable(GL_ALPHA_TEST); 
glBindTexture(GL_TEXTURE_2D, _texture); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
+1

glAlphaTest/glAlphaFuncはちょうどあなたの問題を説明する*本当に便利ではありません。しかし、私はあなたの問題は、この他の質問で解決されたものだと思います:http://stackoverflow.com/questions/7571075/how-to-create-stencil-buffer-with-texture-image-in-opengl-es-2- 0 – rotoglup

+0

コメントありがとうございました。 「動作しない」とは、「_viewTexture」が「_maskTexture」のマスク効果なしで表示されたことを意味します。 私は将来さらに具体的にしようとします。 あなたが言及した記事に関して、私はすでにそれを読んでいますが、私が間違っていなければ、彼はシェイダーで彼の問題を解決し、ステンシルバッファを放棄しました。 – EricD

+1

あなたのソリューションポストを読んでいるうちに、まだ問題が残っていると思います。おそらく今のところ隠されているかもしれません.2回目のレンダリングパスでステンシルテストが無効になっているので、あなたが観察したマスキングはこのテストでは誘発できません。また、ブレンディングは、ステンシルテストには有効ではなく、アルファテストにのみ有効であるべきです。私はあなたが望むマスキングを観察していると思うが、おそらくステンシルをする別の理由があると思われる。 – rotoglup

答えて

1

、問題はあなただけの風合いに何があるかのいずれかのテストを行わずシーンにテクスチャを描画していることです。ステンシルバッファは、テクスチャの色を気にしない、それだけでチェック:

Did you draw a fragment ? (Update stencil buffer) : (Don't update stencil buffer);

をあなたのテクスチャの画素毎の断片を描いているので、テクスチャのいずれかのマスク効果は無用です。

テクスチャでマスクする場合は、を削除するステンシルバッファで更新したくないフラグメントがあれば破棄してください。

これはどちらかであるシェーダでdiscardキーワードで行われ、または*動作しないようOpenGLES 1.1

関連する問題