如何使用stencil buffer实现分层裁剪

3 opengl clipping hierarchy stencil-buffer

我想要实现的目标如下图所示:

插图

假设我们的模板缓冲区处于某种状态,因此目前仅填充红色部分。当我使用标记为黄色的部分更新模板缓冲区时,我需要执行哪些操作,因此最终只有绿色部分才是模板缓冲区的最终状态?

我需要它来实现嵌套元素内容剪切,以防止元素内容渲染超出它们两者组合的边界。

到目前为止,我已经尝试了各种涉及模板测试的布尔运算,但没有成功,这比任何进展都带来了更多的困惑。

请注意,剪刀测试对于此任务来说并不实际,因为元素可能具有任意形状和旋转。

Rab*_*d76 5

如果你有一个层次结构,那么你就有了层次。每个孩子只能在其父母定义的区域内绘制。因此,每个图层都必须对模板缓冲区进行计数(GL_INCR),并且只有在模板缓冲区的当前值等于图层“深度”时才允许绘制:

int layer = 0;
glStencilFunc(GL_ALWAYS, 1, 0xff);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);

// draw initial layer
// ...

layer ++;
glStencilFunc(GL_EQUAL, layer, 0xff);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);

// draw layer 1
// ...

layer ++;
glStencilFunc(GL_EQUAL, layer, 0xff);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);

// draw layer 2
// ...
Run Code Online (Sandbox Code Playgroud)

请注意,一般来说,模板缓冲区有 8 位,这将层数限制为 256。