在 OpenGL 中更新模板缓冲区时出现问题
Issue when updating stencil buffer in OpenGL
我在 mac 上使用 OpenGL 中的模板测试绘图时遇到问题。当我第一次绘制场景时,模板工作正常。我在中间绘制了一个半透明的黑色矩形,启用了写入模板缓冲区的功能,然后绘制了一个更大的蓝色矩形,禁用了写入模板缓冲区的功能。当 window 第一次弹出时,我得到了正确的结果,它看起来像这样:
但是,当我调整 window 的大小时,再次调用渲染函数时,我得到的结果如下所示:
or
有时奇怪的白色 space 会跟随中间的矩形,有时白色会在看似随机的排列之间断裂,但当您回到 window 尺寸时会保持这些排列。我在网上找不到解决方案。这是我的渲染函数,它会在 window 调整大小时随时调用:
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的深度,所以不清除深度缓冲区是可以的(我已经测试过了)。
如您所料,模板缓冲区的清除确实不起作用(除了第一次调用该函数)。
您错过的是 glStencilMask
也会影响 glClear(... | GL_STENCIL_BUFFER_BIT)
。
在进行清除调用之前,您应该将 glStencilMask(0xFF)
向上移动一点。
我在 mac 上使用 OpenGL 中的模板测试绘图时遇到问题。当我第一次绘制场景时,模板工作正常。我在中间绘制了一个半透明的黑色矩形,启用了写入模板缓冲区的功能,然后绘制了一个更大的蓝色矩形,禁用了写入模板缓冲区的功能。当 window 第一次弹出时,我得到了正确的结果,它看起来像这样:
但是,当我调整 window 的大小时,再次调用渲染函数时,我得到的结果如下所示:
有时奇怪的白色 space 会跟随中间的矩形,有时白色会在看似随机的排列之间断裂,但当您回到 window 尺寸时会保持这些排列。我在网上找不到解决方案。这是我的渲染函数,它会在 window 调整大小时随时调用:
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的深度,所以不清除深度缓冲区是可以的(我已经测试过了)。
如您所料,模板缓冲区的清除确实不起作用(除了第一次调用该函数)。
您错过的是 glStencilMask
也会影响 glClear(... | GL_STENCIL_BUFFER_BIT)
。
在进行清除调用之前,您应该将 glStencilMask(0xFF)
向上移动一点。