Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS中使用模具缓冲区_Ios_Opengl Es_Stencil Buffer - Fatal编程技术网

在iOS中使用模具缓冲区

在iOS中使用模具缓冲区,ios,opengl-es,stencil-buffer,Ios,Opengl Es,Stencil Buffer,我尝试使用“模具缓冲区”来显示纹理渲染的一部分,但显示的渲染没有任何遮罩效果 这是一个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,

我尝试使用“模具缓冲区”来显示纹理渲染的一部分,但显示的渲染没有任何遮罩效果

这是一个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”是黑白图片


解决方案:
我终于用rotoglubtim的指示解决了我的问题。 谢谢你们两位

1/模具缓冲区未正确创建。 它应该像这样初始化:

glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthStencilRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, 
                             GL_DEPTH24_STENCIL8_OES, 
                             backingWidth, 
                             backingHeight);
这是我的渲染不受遮罩影响的主要原因

2/为了能够使用纹理作为遮罩,我将黑色替换为alpha通道,并在渲染中启用混合

我的最终渲染代码如下所示:

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

简单地说,问题在于您只是在场景中绘制纹理,而没有对纹理中的内容进行任何测试。模具缓冲区不关心纹理中的颜色,它只是检查:

你画了碎片吗?(更新模具缓冲区):(不更新模具缓冲区)

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

如果要使用纹理遮罩,则需要丢弃不希望在模具缓冲区中更新的任何片段


这可以通过着色器中的
discard
关键字来完成,也可以通过OpenGLES 1.1中的
glAlphaTest/glAlphaFunc
来完成,仅仅将您的问题描述为不起作用并没有真正的帮助。但我想你的问题是在另一个问题中解决的:谢谢你的评论。我所说的“不工作”,是指显示的“_viewTexture”没有任何“_maskTexture”的遮罩效果。我以后会尽量说得更具体一些。关于你提到的帖子,我已经读过了,但如果我没有弄错的话,他用着色器解决了他的问题,并放弃了模具缓冲区。在阅读你的解决方案帖子时,我认为你仍然有问题(可能暂时被隐藏):您的第二次渲染过程禁用了模具测试,因此您观察到的遮罩不会被此测试激发。此外,混合不应用于模板测试,仅用于alpha测试。我认为你观察到了你想要的蒙版,但可能是因为另一个原因,那就是模版。@Eric:这看起来像是一个GLES1.1解决方案,对吗?如果是:那正是我要找的!