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

Posted

技术标签:

【中文标题】在 iO 中使用 Open GL 1.0 模板缓冲区进行屏蔽的问题【英文标题】:Issue with masking using Open GL 1.0 stencil buffer in iOs 【发布时间】:2012-01-03 15:55:58 【问题描述】:

我一直在努力寻找在 iO 上使用 OPEN GL 1.0 中的 Stencil Buffer 进行简单屏蔽的解决方案。

我绘制背景,然后使用 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】:

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

【讨论】:

什么? ES 1.0 没有模板缓冲区?真的吗?我查看了规范,它确实说不需要包含深度或模板缓冲区的实现(尽管它可以并且支持模板操作)。太好了,你甚至不需要在 ES 1.0 中使用深度缓冲区,太棒了! @ChristianRau:这根本不是真的(至少对于 v1.1 来说不是),我刚刚在 OpenGL ES 1.1/ios 上得到了模板阴影。

以上是关于在 iO 中使用 Open GL 1.0 模板缓冲区进行屏蔽的问题的主要内容,如果未能解决你的问题,请参考以下文章

模板缓冲区似乎无法正常工作

gl_FragColor 如何影响模板缓冲区?

FBO 深度和模板渲染缓冲区附件

libgdx 贴花未绘制到模板缓冲区中

WebGL 中有没有办法快速反转模板缓冲区?

简单情况下的模板缓冲区行为 (GL_ALWAYS, GL_LEQUAL)