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

How to use stencil buffer to achieve hierarchical clipping

下图说明了我要实现的目标:

假设我们有一个状态的模板缓冲区,因此目前只有红色部分被填充。当我用标记为黄色的部分更新模板缓冲区时,我需要执行什么操作,所以最终只有绿色部分才是模板缓冲区的最终状态?

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

到目前为止,我尝试了各种涉及模板测试的布尔操作都无济于事,这带来的混乱比任何进展都多。

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

如果你有层次结构,那么你就有层次。每个 child 只允许在其 parent 定义的区域内绘制。所以每一层都必须计算模板缓冲区(GL_INCR)并且只允许绘制,如果模板缓冲区的当前值等于层 "depth":

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。