0

我试图配置我的模板缓冲区,以便在启用时,它会在绘制的像素不透明时设置(从而创建光可以碰撞的像素图)。我所做的是:

    glClearStencil(0); //clear stencil
    glStencilFunc(GL_EQUAL, 0xFF, 0x000000FF); //only where alpha (mask : 0x000000FF) is 0xFF (opaque)
    glStencilOp(GL_INCR, GL_KEEP, GL_KEEP); //increment if passes (if it is opaque)

    render(); //withing this method I sometimes disable the whole thing to draw the floor, for example

然后,我使用以下代码进行测试:

    /* TURN OFF STENCIL */
    glEnable(GL_STENCIL_TEST); //re-enable
    glStencilFunc(GL_EQUAL, 0, 1); //if the test is equal to 1
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); //do not change stencil buffer

    ImageInfo.drawColorSquare(0, 0, Configurations.SCREEN_WIDTH, Configurations.GAME_HEIGHT, Color.BLUE); //drwa blue square

    glDisable(GL_STENCIL_TEST); //disable

但是,有两个问题:

  1. 它似乎并没有忽略透明像素,因为它应该;
  2. 如果一个区域与另一个区域重叠,则它会反转 - 例如,它设置为一个,然后在同一区域中绘制另一个区域,然后再次将其重置为 0。

我不知道为什么会这样。我猜我的面具可能有问题 - 我不确定 OpneGL 在颜色缓冲区中使用了多少像素。此外,根据文档,GL_INCR 应该加到最大值,而不是返回。由于我的模板缓冲区大小是一位,它应该设置为 1,尝试再次增加,失败并保持为 1(而不是重置)。

4

2 回答 2

2

模板测试与颜色缓冲区中发生的情况无关。设置glStencilFunchttp://www.opengl.org/sdk/docs/man/xhtml/glStencilFunc.xml)您可以指定模板测试如何与模板缓冲区中已存储的内容进行交互。
设置glStencilOp( http://www.opengl.org/sdk/docs/man/xhtml/glStencilOp.xml ) 使您可以使用深度测试的结果来执行模板测试。一个很好的教程解释了模板测试和一个非常有启发性的算法,可以在这里找到http://ogldev.atspace.co.uk/www/tutorial37/tutorial37.html

于 2013-09-01T16:46:52.870 回答
1

模板缓冲区通常是一个8位缓冲区,保留了通常用于深度缓冲区的一小部分内存,用于高级拒绝碎片;诸如遮蔽到任意形状而不是使用矩形剪刀框之类的东西。它与您的颜色缓冲区无关,为了确保具有特定 alpha 值的片段不会影响屏幕上的像素,您将使用称为 alpha 测试的东西。

在核心 OpenGL 3 中,不再支持固定功能 alpha 测试,因此您必须在片段着色器中实现它,然后discard如果它未能满足您的条件。

于 2013-09-01T22:00:29.180 回答