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

标签 opengl hierarchy clipping stencil-buffer

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

illustration

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

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

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

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

最佳答案

如果你有层次结构,那么你就有层次。每个 child 只能在其父定义的区域中绘制。所以每一层都必须计算模板缓冲区 ( 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。

关于opengl - 如何使用stencil buffer实现分层裁剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56636337/

相关文章:

r - 防止标签在 hclust/树状图中剪裁

c++ - 来自 vector 的 glDrawArrays 和 GL_LINE_STRIP 的折线图

c++ - 由于非 Ascii 字符,顶点着色器无法编译?

c++ - GL_POINT_SPRITE_ARB 渲染问题

c++ - 围绕原点旋转多边形

c# - 在c#中分层显示父子元素

java - 动态加载的 spring 上下文

html - 如何剪辑(或屏蔽)谷歌地图

linux - 从脚本调用时,Bash find 无法返回所有匹配的文件

c# - 绘制裁剪图像时可以抗锯齿吗?