模板缓冲区似乎无法正常工作
Posted
技术标签:
【中文标题】模板缓冲区似乎无法正常工作【英文标题】:Stencil buffers seem to not work properly 【发布时间】:2014-06-28 19:12:51 【问题描述】:我正在编写一个使用模板缓冲区的 SDL2/现代 OpenGL 应用程序。我在渲染器中编写了以下代码:
glEnable(GL_STENCIL_FUNC);
glClearStencil(0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glStencilFunc(GL_NEVER, 1, 0xFF); //Always fail the stencil test
glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP); //Set the pixels which failed to 1
glStencilMask(0xFF);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
//Drawing small rectangle here
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilFunc(GL_EQUAL, 1, 0xFF); //Only pass the stencil test where the pixel is 1 in the stencil buffer
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); //Dont change the stencil buffer any further
//Drawing big rectangle here
glDisable(GL_STENCIL_FUNC);
上面代码的目标是只绘制适合小矩形的大矩形部分。不幸的是,当我运行代码时会发生相反的情况,它会渲染一个带有小矩形大小的洞的大矩形。
我尝试了更多的模板功能,但它们的结果都是一样的,这似乎应该可以工作。那么,有没有人有任何想法或可以告诉我哪里出错了?
我显然没有在我的帖子中嵌入图片的声誉,但是:
预期结果: http://i.imgur.com/RpbHzCV.jpg 实际结果: http://i.imgur.com/Z5qDqHk.jpg
【问题讨论】:
【参考方案1】:调用glEnable(GL_STENCIL_FUNC);
是错误的,正确的枚举是GL_STENCIL_TEST
。所以你的代码根本不使用模板缓冲区。
我只能猜测为什么你会得到你得到的结果,然后:你的代码可能会将第一个矩形绘制到深度缓冲区中,所以当你绘制第二个矩形时,该区域中的片段可能无法通过深度测试。因此,即使您正确启用了模板测试,您仍然需要注意此处的深度缓冲区。
【讨论】:
哇,大笨蛋。现在一切都很好。 GL_STENCIL_FUNC 到底是为了什么?它似乎是一个适当的常数。 @Taylee:那个可以用于glGet()
查询当前设置的stencil函数。以上是关于模板缓冲区似乎无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
OpenGL / SDL2:模板缓冲区位在 PC 上始终为 0
使用Monitor的Writer / Reader无法正常工作