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

时间:2014-06-28 19:12:51

标签: opengl graphics stencil-buffer

我正在编写一个使用模板缓冲区的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 个答案:

答案 0 :(得分:0)

电话glEnable(GL_STENCIL_FUNC);错误,正确的枚举为GL_STENCIL_TEST。因此,您的代码根本不使用模板缓冲区。

我只能猜到你获得结果的原因,然后:你的代码可能会将第一个矩形绘制到深度缓冲区中,所以当你绘制第二个矩形时,该区域中的碎片可能无法通过深度测试。所以即使你正确启用模板测试,你仍然需要在这里注意depht缓冲区。