use*_*634 5 opengl stencils stencil-buffer
我想在 OpenGL 中设置多个模板,然后绘制它们的多个组合。
例如:我有两个这样的矩形模板:

然后我想画成:
我发现可以在模板缓冲区的不同位中声明多个模板,但我不知道如何。我如何设置glStencilOp并glStencilFunc使其工作?
或者我可以(应该)使用glScissor它吗?
我目前不知道是否可以配置模板缓冲区,以便能够执行上述所有 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 的任何地方绘制一些内容,这意味着至少绘制了一个矩形。
对于两个以上的矩形,它可能会变得更加复杂,您需要尝试一下才能找到最佳的方法。
| 归档时间: |
|
| 查看次数: |
1600 次 |
| 最近记录: |