Opengl Stencil Buffer不透明时设置

时间:2013-09-01 13:19:14

标签: opengl rendering lwjgl stencil-buffer

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

    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. 如果一个区域与另一个区域重叠,则它会反转 - 例如,它设置为1,然后在同一区域绘制另一个区域,并再次将其重置为0。
  3. 我不知道为什么会这样。我想我的面具可能有问题 - 我不确定OpneGL在Color Buffer中使用了多少像素。 此外,根据文档,GL_INCR应该加起来最多,而不是回去。由于我的模板缓冲区大小是一位,它应该设置为1,尝试再次增加,失败,并保持一个(而不是重新设置)。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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