在iOS上使用模板缓冲区

时间:2012-07-08 14:37:16

标签: ios opengl-es stencil-buffer

我尝试使用“模板缓冲区”从纹理中显示渲染的一部分,但我的渲染显示没有任何蒙版效果。

适用于使用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);  

非常感谢任何帮助!

(和法国开发商一样,对不起我的英语!)

精度:“_ maskTexture”是黑色&白色图片。


解决方案:


我终于通过 rotoglub tim 的指示解决了我的问题。 谢谢你们两个。

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 个答案:

答案 0 :(得分:1)

简单来说,问题在于您只是在不对纹理中的内容进行测试的情况下将纹理绘制到场景中。模板缓冲区并不关心纹理中的颜色,它只是检查:

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

您正在为纹理的每个像素绘制一个片段,因此纹理中的任何蒙版效果都是无用的。

如果您想要使用纹理进行遮罩,则需要丢弃您想要在模板缓冲区中更新的任何片段。

要么在着色器中使用discard关键字,要么在OpenGLES 1.1中使用glAlphaTest/glAlphaFunc

相关问题