5

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

これは、OpenGL ES 2.0 を使用した 2D iOS プロジェクト用です。これは私のコードの関連部分です。

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);  

どんな助けでも大歓迎です!

(フランスの開発者としてはいつものことですが、私の英語で申し訳ありません!)

precision : "_maskTexture" は白黒画像です。


解決 :


私はrotoglubtimの指示で問題を最終的に解決しました。あなたがた両方に感謝します。

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);  
4

1 に答える 1

1

簡単に言うと、問題は、テクスチャの内容をテストせずにシーンにテクスチャを描画しているだけだということです。ステンシル バッファはテクスチャの色を気にせず、次のことを確認するだけです。

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

テクスチャのすべてのピクセルに対してフラグメントを描画しているため、テクスチャのマスク効果は役に立ちません。

テクスチャでマスクする場合は、ステンシル バッファーで更新したくないフラグメントを破棄する必要があります。

これはdiscard、シェーダーのキーワードまたはglAlphaTest/glAlphaFuncOpenGLES 1.1で行われます。

于 2012-07-08T17:09:29.553 に答える