在OpenGL中更新模板缓冲区时出现问题

4

我在Mac上使用OpenGL绘制时,使用模板测试时遇到了问题。当我第一次绘制场景时,模板正常工作。我在中间绘制了一个半透明的黑色矩形,并启用了对模板缓冲区的写入,然后绘制了一个更大的蓝色矩形,并禁用了对模板缓冲区的写入。当窗口第一次弹出时,我得到了正确的结果,如下图所示:

Correct (Initial) Render

然而,当我调整窗口大小并再次调用渲染函数时,我得到的结果看起来像这样:

问题示例#1问题示例#2

有时奇怪的白色空间会跟随中间矩形,其他时候白色空间会在看起来随意的排列之间弹出,但当您回到该窗口大小时,保留这些排列。我在网上找不到任何解决方案。这是我的渲染函数,在任何时候窗口大小调整时都会被调用:

glClearColor(0, 0, 0, 1);
glClearStencil(0x00);
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

// Replace data in the stencil buffer with 1s if it passes the test
//  which should be GL_ALWAYS
glStencilFunc(GL_ALWAYS, 1, 0xFF); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

// Allow data to be written to the stencil buffer.
glStencilMask(0xFF);

p->fillSquare(1, 1, 1, 0.3, -0.25, 0.25, 0.25, 0.25, -0.25, -0.25, 0.25, -0.25); // Write a semi transparent black rectangle

glStencilMask(0x00); // Disable writing to the stencil buffer.
glStencilFunc(GL_NOTEQUAL, 1, 0xFF); // Only draw if stencil value is 1.

// Draw blue rectangle
p->fillSquare(0.60, 0.60, 0.80, 1, -0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5);

glfwSwapBuffers(w);

如果您想知道,p->fillRect()需要四个浮点数作为矩形的RGBA颜色,然后是每个顶点的x和y坐标。
似乎在清除模板时可能存在某种问题,但我无法确定。在我的OpenGL初始化函数中已经打开了模板测试。 如果您需要了解代码或系统的其他方面,请随意评论。
注意:我不使用OpenGL的深度,因此不清除深度缓冲区也没关系(我已经进行了测试)。
1个回答

7
清除模板缓存确实不像你期望的那样有效(除了第一次调用该函数)。
你忽略了glStencilMask也会影响glClear(... | GL_STENCIL_BUFFER_BIT)。 你应该在清除之前稍微移动一下glStencilMask(0xFF)。

对我来说,理解这个模板绘图需要一分钟时间。glStencilMask()决定了是否可以写入模板缓冲区。如果没有调用glStencilMask(0xFF),则glClear(GL_STENCIL_BUFFER_BIT)无法写入它。因此,在glClear(...)之前调用glStencilMask(0xFF),以便它也可以清除模板。然后,如果需要,可以在清除后立即绘制到模板中,再调用glStencilMask(0xFF) - David Sullivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接