OpenGL - 矩形中的模板测试

时间:2015-09-28 07:50:01

标签: c++ opengl graphics stencil-buffer

我打算画一个中心有一个洞的矩形。我正在尝试使用模板测试,但我无法使其工作。你可以在下面看到我是怎么做的。

glEnable(GL_STENCIL_TEST);
glColorMask(GL_FALSE,GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
glStencilFunc(GL_ALWAYS, 2, ~0);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
// Draw the rectangle here
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilFunc(GL_EQUAL, 2, ~0);
glStencilOp(GL_INCR, GL_INCR, GL_INCR);

我在这里做错了什么?任何帮助将不胜感激! :)

1 个答案:

答案 0 :(得分:1)

我认为你的情况是你已经在帧缓冲区中绘制了一些东西,现在你想绘制一个带有洞的矩形,这样它就不会覆盖洞下面的东西,而是覆盖在洞下面的东西。无孔部分。

逻辑上,这意味着您首先将 hole 绘制到模板缓冲区中,然后在绘制矩形时使用模板测试排除这些片段。

在代码中,它看起来像这样:

glEnable(GL_STENCIL_TEST);

// Fill stencil buffer with 0's
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);

// Write 1's into stencil buffer where the hole will be
glColorMask(GL_FALSE,GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
glStencilFunc(GL_ALWAYS, 1, ~0);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
drawHoleShape();

// Draw rectangle, masking out fragments with 1's in the stencil buffer
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);
glStencilFunc(GL_NOTEQUAL, 1, ~0);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
drawRectangle();

// Cleanup, if necessary
glDisable(GL_STENCIL_TEST);

当然,您可以使用2(或任何其他模板位/值)代替1