5

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

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

多个区域

然后我想画:

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

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

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

4

1 回答 1

2

我目前不知道,是否可以将模板缓冲区配置为能够执行上述所有 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 的任何地方绘制一些东西,这意味着至少绘制了一个矩形。

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

于 2012-03-12T13:32:30.370 回答