opengl – 在GL中组合多个模板

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

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

然后我想画入:

>任何地方
>左边的长方形(蓝紫色)
>右边的矩形(紫红色)
>中间矩形(紫色)
>整个彩色区域(蓝紫红色)

我发现可以在不同的模板缓冲区中声明多个模板,但我不知道如何.
如何设置glStencilOp和glStencilFunc才能使用?

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

最佳答案 我目前不知道,是否可以将模板缓冲区配置为能够执行上述所有5个步骤而不对它们之间的模板缓冲区进行任何更改.如果glStencilOp提供按位OR很容易,但它没有,只是使用增量或减量,你将不得不多次绘制矩形.

但如果区域总是长方形,为什么不使用剪刀测试呢?因此,只需使用glScissor设置矩形区域并启用剪刀测试(glEnable(GL_SCISSOR_TEST))即可完成前3个步骤(实际上是2个和3个步骤).

对于中间的(步骤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

因此,我们首先绘制两个矩形,并在绘制的任何地方增加模板值.然后我们在模板值为2的每个地方绘制我们的东西,意味着绘制了两个矩形.

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

glStencilFunc(GL_LEQUAL, 1, 0xFFFFFFFF);

第二次传球这样你就可以在模板缓冲区至少为1的地方绘制一些东西,这意味着至少绘制了一个矩形.

对于两个以上的矩形,它可能会变得更复杂,你需要玩一下才能找到最佳方式.

点赞