opengl 模板缓冲区 - 不太好用

Posted

技术标签:

【中文标题】opengl 模板缓冲区 - 不太好用【英文标题】:opengl stencil buffer - not quite got it working 【发布时间】:2012-01-14 10:52:01 【问题描述】:

目前我正在绘制背景,然后在模板缓冲区中绘制一个透明三角形,然后在未绘制三角形的地方绘制一个蓝色正方形。我希望效果是一个蓝色的正方形,带有一个三角形的孔,露出背景。但我得到的只是一个黑色三角形,覆盖在其他所有东西上。我认为我在正方形上得到了想要的效果,但模板也被应用于背景。

我的问题是如何调整以下代码以允许背景通过正方形的三角形孔显示?

static void Draw(void)

glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

//big blue square
glColor3ub(0,255,255);
glBegin(GL_POLYGON);
glVertex3i(5, 5, 0);
glVertex3i(-5, 5, 0);
glVertex3i(-5, -5, 0);
glVertex3i(5, -5, 0);
glEnd();

glStencilFunc(GL_ALWAYS, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

/* transparent triangle */
glColor4ub(0.0f, 0.0f, 0.0f, 0.0f);
glBegin(GL_POLYGON);
glVertex3i(-4, -4, 0);
glVertex3i(4, -4, 0);
glVertex3i(0, 4, 0);
glEnd();

glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_INCR, GL_KEEP, GL_DECR);

glStencilFunc(GL_EQUAL, 2, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

/* blue square */
glColor3ub(0, 0, 200);
glBegin(GL_POLYGON);
glVertex3i(3, 3, 0);
glVertex3i(-3, 3, 0);
glVertex3i(-3, -3, 0);
glVertex3i(3, -3, 0);
glEnd();

if (doubleBuffer) 
    glutSwapBuffers();
 else 
    glFlush();


【问题讨论】:

【参考方案1】:

问题一:在绘制背景时,要么先禁用模板测试,要么将模板功能切换为 GL_ALWAYS 以便片段通过(我建议将其关闭)。然后你在之后设置两个不同的模板 modi,但都不会做你想要的。所以这里是变化:

glDisable(GL_STENCIL_TEST);
glStencilMask(0x0);

draw_background();

glEnable(GL_STENCIL_TEST);
glStencilMask(0x1);
glStencilFunc(GL_ALWAYS, 0x1, 0x1);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);

draw_trangle();

glStencilFunc(GL_NOTEQUAL, 0x1, 0x1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);

draw_blue_square();

【讨论】:

谢谢,但这不太行。我所看到的只是背景上没有三角形孔的正方形。我在 main 中设置的方式有什么问题吗? @westr:是的,可以。我也承认,我没有测试该代码。你能把你的整个源代码放在pastebin吗?这使我能够 a) 重现您的问题并 b) 将其修复到位。 玩了一整天,终于用我的原始代码让它工作了,但在绘图之前启用了 alpha 混合,我想我应该从一开始就这样做。如果其他人遇到同样的问题或@datenwolf,如果我仍然做错了,工作代码在这里pastebin.com/4xbMbwE9 我给了你一个稍微错误的方法,你需要在绘制遮蔽三角形时启用模板测试,并设置模板遮罩以包含你想要测试深蓝色四边形的位。请参阅此版本pastebin.com/vJFumvQz 和我的合理回答。

以上是关于opengl 模板缓冲区 - 不太好用的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL ES 中为帧缓冲区使用深度和模板渲染缓冲区附件

将模板渲染缓冲区绑定到opengl中的帧缓冲区

Linux C++ 上 Gtkmm 中的 OpenGL 模板缓冲区

OpenGL如何在模板测试失败且深度测试成功时写入模板缓冲区?

android opengl 2.0 模板缓冲区不起作用

模板的OpenGL修剪/内联轮廓