OpenGL - 矩形中的模板测试
OpenGL - Stencil Test in a Rectangle
我打算画一个中间有洞的矩形。我正在尝试对其进行模板测试,但我无法使其正常工作。你可以在下面看到我是怎么做的。
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);
我在这里做错了什么?任何帮助将不胜感激! :)
我假设你的情况是你已经在帧缓冲区中画了一些东西,现在你想画一个有洞的矩形,这样它就不会覆盖洞下面的东西,而是覆盖掉洞下面的东西在非孔部分下面
从逻辑上讲,这意味着您首先将孔绘制到模板缓冲区中,然后使用模板测试排除那些片段绘制矩形。
在代码中,它看起来像这样:
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
(或任何其他模板 bit/value)代替 1
。
我打算画一个中间有洞的矩形。我正在尝试对其进行模板测试,但我无法使其正常工作。你可以在下面看到我是怎么做的。
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);
我在这里做错了什么?任何帮助将不胜感激! :)
我假设你的情况是你已经在帧缓冲区中画了一些东西,现在你想画一个有洞的矩形,这样它就不会覆盖洞下面的东西,而是覆盖掉洞下面的东西在非孔部分下面
从逻辑上讲,这意味着您首先将孔绘制到模板缓冲区中,然后使用模板测试排除那些片段绘制矩形。
在代码中,它看起来像这样:
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
(或任何其他模板 bit/value)代替 1
。