テクスチャからレンダリングの一部を表示するために「ステンシルバッファ」を使用しようとしましたが、レンダーはマスク効果なしで表示されます。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);
で
glAlphaTest/glAlphaFunc
はちょうどあなたの問題を説明する*本当に便利ではありません。しかし、私はあなたの問題は、この他の質問で解決されたものだと思います:http://stackoverflow.com/questions/7571075/how-to-create-stencil-buffer-with-texture-image-in-opengl-es-2- 0 – rotoglupコメントありがとうございました。 「動作しない」とは、「_viewTexture」が「_maskTexture」のマスク効果なしで表示されたことを意味します。 私は将来さらに具体的にしようとします。 あなたが言及した記事に関して、私はすでにそれを読んでいますが、私が間違っていなければ、彼はシェイダーで彼の問題を解決し、ステンシルバッファを放棄しました。 – EricD
あなたのソリューションポストを読んでいるうちに、まだ問題が残っていると思います。おそらく今のところ隠されているかもしれません.2回目のレンダリングパスでステンシルテストが無効になっているので、あなたが観察したマスキングはこのテストでは誘発できません。また、ブレンディングは、ステンシルテストには有効ではなく、アルファテストにのみ有効であるべきです。私はあなたが望むマスキングを観察していると思うが、おそらくステンシルをする別の理由があると思われる。 – rotoglup