在矩形中进行模板测试

OpenGL - Stencil Test in a Rectangle

本文关键字:测试      更新时间:2023-10-16

我计划画一个矩形,在它的中心有一个洞。我试着用模板测试,但我不能使它工作。你可以在下面看到我是怎么做的。

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

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

我假设你的情况是你已经在framebuffer中画了一些东西,现在你想画一个带洞的矩形,这样它就不会覆盖洞下面的东西,而是覆盖非孔部分下面的东西。

从逻辑上讲,这意味着您首先将绘制到模板缓冲区中,然后在绘制矩形时使用模板测试排除这些片段。 在代码中,它看起来像这样:
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