模板缓冲区似乎无法正常工作

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

在 arcore 中的 3d 对象上使用模板蒙版的问题

使用Monitor的Writer / Reader无法正常工作

无法让模板工作

无法让 Stencil Buffer 在 iOS 4+ 中工作(5.0 工作正常)。 [OpenGL ES 2.0]

webGL - 如何在帧缓冲区旁边设置模板缓冲区并使用它?