【问题标题】: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

【问题讨论】:

    标签: opengl graphics stencil-buffer


    【解决方案1】:

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

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

    【讨论】:

    • 哇,大笨蛋。现在一切都很好。 GL_STENCIL_FUNC 到底是为了什么?它似乎是一个适当的常数。
    • @Taylee:那个可以用于glGet()查询当前设置的stencil函数。
    猜你喜欢
    • 2018-06-10
    • 2017-09-04
    • 2012-05-06
    • 2013-02-17
    • 2017-10-09
    • 2017-08-03
    • 2014-05-02
    • 2011-09-11
    • 2016-02-11
    相关资源
    最近更新 更多