如何使用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。
下图说明了我要实现的目标:
假设我们有一个状态的模板缓冲区,因此目前只有红色部分被填充。当我用标记为黄色的部分更新模板缓冲区时,我需要执行什么操作,所以最终只有绿色部分才是模板缓冲区的最终状态?
我需要这个来实现嵌套元素的内容裁剪,以防止要渲染的元素内容超出它们两者的边界。
到目前为止,我尝试了各种涉及模板测试的布尔操作都无济于事,这带来的混乱比任何进展都多。
请注意,剪刀测试并非实际用于此任务,因为元素可能具有任意形状和旋转。
如果你有层次结构,那么你就有层次。每个 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。