首页 > 解决方案 > 如何使用stencil buffer实现分层剪裁

问题描述

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

插图

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

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

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

请注意,对于这个任务,剪刀测试不是实际的,因为元素可能具有任意形状和旋转。

标签: openglhierarchyclippingstencil-buffer

解决方案


如果你有一个层次结构,那么你就有层次。每个孩子只能在其父母定义的区域内绘图。因此,每一层都必须计算模板缓冲区 ( 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
// ...

请注意,通常模板缓冲区有 8 位,这将层数限制为 256。


推荐阅读