1

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

4

1 回答 1

0

调用glEnable(GL_STENCIL_FUNC);是错误的,正确的枚举是GL_STENCIL_TEST. 所以你的代码根本不使用模板缓冲区。

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

于 2014-06-28T19:59:14.790 回答