0

テクスチャを使用してビューポート全体をマスクする方法を探しています。私の場合、市松模様の白黒パターン (または任意の 2 色) を使用し、シーンで黒の部分のみを表示したいと考えています。

これを行う最善の方法は、クリッピング マスク、フラグメント シェーダー、またはアルファ ブレンディングです。SO でこの投稿を見てきました: How to create Stencil buffer with texture (Image) in OpenGL-ES 2.0これは必要なものと似ているようですが、discard キーワードをどうするか完全には理解できません。それは私の状況に当てはまりますか。

4

1 に答える 1

0

黒と白の正方形の市松模様のテクスチャがあるとします。まず、ステンシル テストをセットアップしてマスクを描画します。

glEnable(GL_STENCIL_TEST);
glDisable(GL_DEPTH_TEST);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);

glStencilFunc(GL_ALWAYS, 1, -1);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

次に市松模様のテクスチャを描きます。ここでの重要なステップ (破棄が行われる場所) は、チェッカーボードが黒のフラグメントのみを描画するようにフラグメント シェーダーを設定することです (または、必要に応じて白に反転します)。破棄キーワードは、条件に一致しないピクセルのレンダリングをスキップします。

//in the fragment shader
if(sampleColor.r > 0.5) { discard; }

このレンダリング手順の後、バッファーの半分のステンシル値が 0 で、残りの半分のステンシル値が 1 であるチェッカーボード イメージを含むステンシル バッファーが作成されます。

次に、ステンシル バッファーが == 1 の場合に合格するように、ステンシル テストを有効にして通常どおりレンダリングします。

glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glStencilFunc(GL_EQUAL, 1, -1);
于 2012-07-06T20:09:29.657 に答える