关于文章OpenGL 剪辑中讨论的问题,出现了一个新问题。
我正在为基于节点的 2D 场景图实现裁剪。每当剪裁框轴对齐时,我都会使用 glScissor ,就像在 OpenGL 剪裁中提出的那样。我已经成功实现了轴对齐框的节点裁剪。
事实证明,每个节点都必须将其裁剪矩形与其使用裁剪的祖先相交。(如果兄弟姐妹与祖先的剪切框重叠,这是必要的)。
必须使用模板缓冲区来实现与非轴对齐矩形相交的机制。我开始在OpenGL 剪辑中实施建议的解决方案,但是在孩子们的剪辑矩形与他们的祖先重叠的问题上遇到了问题。
现在,模板剪裁只需一个剪裁盒即可完美运行。但是,如果孩子或孙子与祖先相交,算法会失败,因为此处需要 2 个相关矩形的交集(如在轴对齐版本中)作为掩码,而不是孩子的完整矩形。
我已经想到了以下算法:
最上面的节点写入以计数器值 1 开始,并将其填充为 1 的剪切矩形绘制到模板缓冲区中,并根据 1 渲染它的子模板测试。每个也打开了剪切的兄弟节点通过将1 添加到它来绘制它的边界矩形模板缓冲区,然后针对 2 进行测试,依此类推。现在,当剪裁矩形的兄弟姐妹与祖先剪裁矩形重叠时,它们重叠的区域将被 2 填充,在对 2 进行测试时提供完美的剪裁。该算法可以扩展到最多 255 个嵌套剪裁节点。
我的问题来了:
我如何执行对模板缓冲区的渲染,而不是写入 1,而是在执行渲染时将 1 添加到当前模板缓冲区值。
这是我用来准备渲染到模板缓冲区的代码:
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, ref, mask);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
我正在寻找一种设置,它将模板缓冲区的当前值增加 ref 的值,而不是将 ref 写入缓冲区。
有人可以帮我吗?