2015-11-05 55 views
1

我在使用mac上的OpenGL中的模板测试进行绘图时遇到了问题。当我第一次画场景时,模板工作正常。我在中间绘制了一个半透明的黑色矩形,写入启用的模板缓冲区,然后更大的蓝色矩形写入模板缓冲区。我得到正确的结果,当窗口首先弹出,它看起来像这样:在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()需要四个浮标为矩形的RGBA颜色,然后在x和y各自的坐标顶点。

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

注意:我没有使用OpenGL的深度,所以可以不清除深度缓冲区(我测试过了)。

回答

4

模板缓冲区的清除确实无法如您所期望的那样工作(除了第一次调用funtion)。

您错过的是glStencilMask也会影响glClear(... | GL_STENCIL_BUFFER_BIT)。 在进行清除呼叫之前,您应该稍微移动glStencilMask(0xFF)