OpenGL模板缓冲区没有按照我的预期行事

时间:2011-03-10 07:23:27

标签: opengl stencil-buffer

我有一个简单的UI小部件系统,我正在使用模板缓冲区作为限幅器,因此无法在小部件外部绘制小部件的子节点。基本上,所有内容的模板值都在这个小部件的边界内增加。然后,我制作剪刀后绘制的任何内容都必须在框内。

clipper构造函数如下所示:

// Stencil buffer and ClipperStack.size() start at 0
// Increment any pixel in the rect on my current recursion level 
glStencilFunc(GL_EQUAL, ClipperStack.size(), 0xFF);
glStencilOp(GL_KEEP, GL_INCR, GL_INCR);
ClipperStack.push_back(Rect);
// only draw to stencil buffer
glColorMask(0, 0, 0, 0);
glStencilMask(1);
glBegin(GL_QUADS);
    glVertex2f(Rect.Left, Rect.Top);
    glVertex2f(Rect.Left, Rect.Bottom);
    glVertex2f(Rect.Right, Rect.Bottom);
    glVertex2f(Rect.Right, Rect.Top);
glEnd();
// Stencil clipper drawn, 
glColorMask(1, 1, 1, 1);
glStencilMask(0);
// now only draw stuff that's that has the right clipper value
glStencilFunc(GL_EQUAL, ClipperStack.size(), 0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

当裁剪器超出范围时,析构函数会运行,如下所示:

// Decrement anything we previously incremented
glStencilFunc(GL_EQUAL, ClipperStack.size(), 0xFF);
glStencilOp(GL_KEEP, GL_DECR, GL_DECR);
// Get the old rect
sf::FloatRect Rect = clipperStack.back();
ClipperStack.pop_back();
// Only draw to stencil buffer
glColorMask(0, 0, 0, 0);
glStencilMask(1);
glBegin(GL_QUADS);
    glVertex2f(Rect.Left, Rect.Top);
    glVertex2f(Rect.Left, Rect.Bottom);
    glVertex2f(Rect.Right, Rect.Bottom);
    glVertex2f(Rect.Right, Rect.Top);
glEnd();
// now draw on regular color buffer again, 
// stencil buffer should be the same as before constructor call
glColorMask(1, 1, 1, 1);
glStencilMask(0);
glStencilFunc(GL_EQUAL, ClipperStack.size(), 0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

然而,当我运行它时,只绘制了我的根小部件的直接子节点。孩子的孩子根本不被吸引。我尝试了很多这种变化,我一直在做错事。我不知道我在哪里弄错了。

1 个答案:

答案 0 :(得分:1)

在构造函数和析构函数中,我认为你需要设置glStencilMask()来设置模板缓冲区的每一位。例如。如果你有一个8位模板缓冲区,你想使用glStencilMask(0xFF);

当然,如果你只有一个1位模板缓冲区,那么你的代码根本无法工作,因为你试图增加每个子小部件级别的模板值。

相关问题