我正在尝试配置我的模板缓冲区,以便在启用时,它会在绘制的像素不透明时设置(从而创建光可以与之碰撞的像素映射)。我所做的是:
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
然而,有两个问题:
我不知道为什么会这样。我想我的面具可能有问题 - 我不确定OpneGL在Color Buffer中使用了多少像素。 此外,根据文档,GL_INCR应该加起来最多,而不是回去。由于我的模板缓冲区大小是一位,它应该设置为1,尝试再次增加,失败,并保持一个(而不是重新设置)。
答案 0 :(得分:2)
模板测试与颜色缓冲区中发生的事情无关。设置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
答案 1 :(得分:1)
模板缓冲区通常是一个8位缓冲区,它保留了通常用于深度缓冲区的一小部分内存,用于高级拒绝片段;像屏蔽任意形状而不是使用矩形剪刀盒的东西。它与您的颜色缓冲区无关,并且为了确保具有特定alpha值的片段不会影响屏幕上的像素,您将使用称为alpha测试的内容。
在核心OpenGL 3中,不再支持固定功能alpha测试,所以你必须在片段着色器中实现它,然后discard
如果它不能满足你的条件。