【问题标题】:Opengl Stencil Buffer set when not transparent不透明时设置Opengl Stencil Buffer
【发布时间】:2013-09-01 13:19:14
【问题描述】:

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

    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。

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

【问题讨论】:

  • glStencilFunc 中的 mask 参数不是指颜色缓冲区中的像素值,而是指模板缓冲区中的值。您不能以这种方式使用模板缓冲区。
  • 你是说没有办法只添加不透明的像素?我正在关注本教程:archive.gamedev.net/archive/reference/programming/features/… 我处于第一步,遇到了这个巨大的问题......

标签: opengl rendering lwjgl stencil-buffer


【解决方案1】:

模板测试与颜色缓冲区中发生的情况无关。设置glStencilFunc (http://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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 2017-01-11
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多