在 GL 中组合多个模板

use*_*634 5 opengl stencils stencil-buffer

我想在 OpenGL 中设置多个模板,然后绘制它们的多个组合。

例如:我有两个这样的矩形模板:

多个区域

然后我想画成:

  1. 任何地方
  2. 左矩形(蓝色+紫色)
  3. 右矩形(紫色+红色)
  4. 中间矩形(紫色)
  5. 整个彩色区域(蓝色+紫色+红色)

我发现可以在模板缓冲区的不同位中声明多个模板,但我不知道如何。我如何设置glStencilOpglStencilFunc使其工作?

或者我可以(应该)使用glScissor它吗?

Chr*_*ica 2

我目前不知道是否可以配置模板缓冲区,以便能够执行上述所有 5 个步骤,而不需要对它们之间的模板缓冲区进行任何更改。如果提供按位或,这会很容易glStencilOp,但事实并非如此,并且仅使用增量或减量,您将不得不多次绘制矩形。

但如果这些区域始终是矩形,为什么不直接使用剪刀测试呢?因此,前 3 个步骤(或实际上第 2 步和第 3 步)只需通过设置矩形区域并glScissor启用剪刀测试 ( glEnable(GL_SCISSOR_TEST)) 即可完成。

对于中间的(第 4 步),您可以自己计算紫色相交矩形并再次使用剪刀测试,或者使用模板测试:

glEnable(GL_STENCIL_TEST);
glStencilFunc(/*whatever*/);
glStencilOp(GL_INCR, GL_INCR, GL_INCR);    //increase the stencil value
//draw both rectangles

glStencilFunc(GL_EQUAL, 2, 0xFFFFFFFF);    //only draw where both rectangles are
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);    //don't change the stencil buffer
//draw things
Run Code Online (Sandbox Code Playgroud)

因此,我们首先绘制两个矩形,并在绘制它们的地方增加模板值。然后我们在模板值为 2 的地方绘制我们的东西,这意味着两个矩形都被绘制了。

对于第五步,您使用相同的模板缓冲区,但使用

glStencilFunc(GL_LEQUAL, 1, 0xFFFFFFFF);
Run Code Online (Sandbox Code Playgroud)

对于第二遍。这样,您就可以在模板缓冲区至少为 1 的任何地方绘制一些内容,这意味着至少绘制了一个矩形。

对于两个以上的矩形,它可能会变得更加复杂,您需要尝试一下才能找到最佳的方法。