在iOs中使用Open GL 1.0模板缓冲区进行屏蔽的问题

我一直在努力寻找一个解决scheme,使用OPEN GL 1.0中的Stencil Buffer在iOs上进行简单的掩膜。

我绘制背景,然后使用glPushMatrix绘制使用drawFrame绘制的框架。

我的框架是由VideoFrameTexture构成的,我尝试使用模板缓冲区使用maskTexture进行遮罩。 我的目标是只绘制videoFrameTexture的一部分(这是由我的面具的白色区域,并对应于一个圆形)定义在背景上。

我使用下面的代码,但掩模图像不考虑。 这是一个黑色和白色的PNG。

-(void) drawFrame{ GLfloat vertexes[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f }; GLshort texes[] = { 1, 1, 0, 1, 0, 0, 1, 0, }; glColor4f(1.0, 1.0, 1.0, 1.0); glVertexPointer(3, GL_FLOAT, 0, vertexes); glEnableClientState(GL_VERTEX_ARRAY); glTexCoordPointer(2, GL_SHORT, 0, texes); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_DEPTH_TEST); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glEnable(GL_STENCIL_TEST); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); glStencilFunc(GL_ALWAYS, 1, 0xffffffff); /// Mask Drawing glBindTexture(GL_TEXTURE_2D, maskTexture); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glEnable(GL_DEPTH_TEST); glStencilFunc(GL_EQUAL, 1, 0xffffffff); /* draw if ==1 */ glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); ///Frame Drawing glBindTexture(GL_TEXTURE_2D, videoFrameTexture); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDisable(GL_STENCIL_TEST); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glDeleteTextures(1, &videoFrameTexture); } 

我使用下面的代码绘制我的视图:

 - (void) drawView { [EAGLContext setCurrentContext:context]; //glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT| GL_STENCIL_BUFFER_BIT); glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f); glViewport(0, 0, backingWidth, backingHeight); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glScalef(1, 0.75, 1); glTranslatef(0, -1, 0); glRotatef(90, 0.0f, 0.0f, 1.0f); [self drawBackground]; glPopMatrix(); glPushMatrix(); glScalef(1, 1, 1); glTranslatef(0, 1, 0); glRotatef(90, 0.0f, 0.0f, 1.0f); [self drawFrame]; glPopMatrix(); //present frame buffer glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); [context presentRenderbuffer:GL_RENDERBUFFER_OES]; } 

模板缓冲区不适用于1.0。 只有2.0

Interesting Posts