繁体   English   中英

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

[英]Issue when updating stencil buffer in OpenGL

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

正确(初始)渲染

但是,当我调整窗口大小并再次调用渲染函数时,我得到的结果如下所示:

问题示例 #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 的深度,所以可以不清除深度缓冲区(我已经测试过了)。

正如您所期望的那样,清除模板缓冲区确实不起作用(除了第一次调用该函数)。

您错过的是glStencilMask也会影响glClear(... | GL_STENCIL_BUFFER_BIT) 在执行 clear 调用之前,您应该将glStencilMask(0xFF)向上移动一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM