我想在 OpenGL 中设置多个模板,然后绘制它们的多个组合。
例如:我有两个这样的矩形模板:
然后我想画:
- 任何地方
- 左矩形(蓝色+紫色)
- 右矩形(紫色+红色)
- 中间矩形(紫色)
- 整个彩色区域(蓝色+紫色+红色)
我发现可以在模板缓冲区的不同位中声明多个模板,但我不知道如何。我该如何设置glStencilOp
并glStencilFunc
让它工作?
或者我可以(应该)使用glScissor
它吗?
我想在 OpenGL 中设置多个模板,然后绘制它们的多个组合。
例如:我有两个这样的矩形模板:
然后我想画:
我发现可以在模板缓冲区的不同位中声明多个模板,但我不知道如何。我该如何设置glStencilOp
并glStencilFunc
让它工作?
或者我可以(应该)使用glScissor
它吗?
我目前不知道,是否可以将模板缓冲区配置为能够执行上述所有 5 个步骤,而无需对它们之间的模板缓冲区进行任何更改。如果glStencilOp
提供按位 OR 会很容易,但它不会,并且仅使用增量或减量就必须多次绘制矩形。
但是如果区域总是矩形,为什么不直接使用剪刀测试呢?所以前 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
所以我们首先绘制两个矩形,并在绘制它们的任何地方增加模板值。然后我们在 stencil 值为 2 的任何地方绘制我们的东西,这意味着两个矩形都被绘制了。
对于第 5 步,您使用相同的模板缓冲区,但使用
glStencilFunc(GL_LEQUAL, 1, 0xFFFFFFFF);
第二遍。这样,您可以在模板缓冲区至少为 1 的任何地方绘制一些东西,这意味着至少绘制了一个矩形。
对于两个以上的矩形,它可能会变得更加复杂,您需要尝试一下才能找到最佳方式。