我要实现的目标如下图所示:
比方说,我们处于状态的模板缓冲区中,因此目前仅填充红色部分。当我用标记为黄色的部分更新模板缓冲区时,我需要执行哪些操作,所以最后只有绿色部分才是模板缓冲区的最终状态?
我需要这样做来实现嵌套元素内容的裁剪,以防止元素的内容超出它们合并后的范围。
到目前为止,我已经尝试了各种涉及模版测试的布尔操作,但无济于事,这比任何进展都带来了更多的困惑。
请注意,剪刀测试不适用于此任务,因为元素可能具有任意形状和旋转度。
答案 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。