Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 在GL中组合多个模具_Opengl_Stencil Buffer_Stencils - Fatal编程技术网

Opengl 在GL中组合多个模具

Opengl 在GL中组合多个模具,opengl,stencil-buffer,stencils,Opengl,Stencil Buffer,Stencils,我想在OpenGL中设置多个模具,然后将它们绘制成多个组合 例如: 我有两个矩形模板,如下所示: 然后,我想讨论一下: 任何地方 左矩形(蓝色+紫色) 右矩形(紫色+红色) 中间矩形(紫色) 全彩色区域(蓝色+紫色+红色) 我发现可以在不同的模具缓冲区中声明多个模具,但我不知道如何声明。 如何设置glStencilOp和glStencilFunc使其工作 或者我可以(我应该)使用glScissor吗?我目前不知道,是否可以配置模具缓冲区,以便在不更改模具缓冲区的情况下执行上述5个步骤。如果gl

我想在OpenGL中设置多个模具,然后将它们绘制成多个组合

例如: 我有两个矩形模板,如下所示:

然后,我想讨论一下:

  • 任何地方
  • 左矩形(蓝色+紫色)
  • 右矩形(紫色+红色)
  • 中间矩形(紫色)
  • 全彩色区域(蓝色+紫色+红色)
  • 我发现可以在不同的模具缓冲区中声明多个模具,但我不知道如何声明。 如何设置
    glStencilOp
    glStencilFunc
    使其工作


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

    我目前不知道,是否可以配置模具缓冲区,以便在不更改模具缓冲区的情况下执行上述5个步骤。如果
    glStencilOp
    提供了按位或,这将很容易,但它不提供,并且仅使用递增或递减,就必须多次绘制矩形

    但是如果区域总是矩形,为什么不使用剪刀测试呢?因此,前3步(实际上是第2步和第3步)可以通过使用
    glScissor
    设置矩形区域并启用剪切测试(
    glEnable(GL\u scissor\u测试)
    )来完成

    对于中间的一个(步骤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,这意味着两个矩形都画了

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

    glStencilFunc(GL_LEQUAL, 1, 0xFFFFFFFF);
    
    第二关。这样,您可以在模具缓冲区至少为1的任何位置绘制某些内容,这意味着至少绘制了一个矩形


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

    如果它们始终是矩形,
    glScissor
    是一个好主意,但它肯定不适用于5个。