gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:31:40 26 4
gpt4 key购买 nike

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

Correct (Initial) Render

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

Issue Example #1Issue Example #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() 采用四个 float 表示矩形的 RGBA 颜色,然后是每个顶点的 x 和 y 坐标。

清除模板似乎有某种问题,但我真的不能确定。我确实在我的 OpenGL 初始化函数中打开了模板测试。如果您需要了解有关我的代码或系统其他方面的任何其他信息,请随时发表评论。

注意:我没有使用 OpenGL 的深度,所以不清除深度缓冲区是可以的(我已经对此进行了测试)。

最佳答案

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

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

关于c++ - 在 OpenGL 中更新模板缓冲区时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33548848/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com