如何使用模板缓冲区实现分层裁剪

时间:2019-06-17 17:38:30

标签: opengl hierarchy clipping

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

illustration

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

我需要这样做来实现嵌套元素内容的裁剪,以防止元素的内容超出它们合并后的范围。

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

请注意,剪刀测试不适用于此任务,因为元素可能具有任意形状和旋转度。

1 个答案:

答案 0 :(得分:3)

如果您具有层次结构,则可以进行分层。每个孩子只能在其父母定义的区域中绘画。因此,如果模板缓冲区的当前值等于“深度”层,则每一层都必须向上计数模板缓冲区(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。