首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL ES模具操作

OpenGL ES模具操作
EN

Stack Overflow用户
提问于 2011-09-27 13:45:34
回答 1查看 2.5K关注 0票数 0

关于OpenGL clipping条款中讨论的问题,出现了一个新的问题。

我正在实现一个基于节点的2D场景图的裁剪。每当裁剪框是轴对齐时,我就使用glScissor,就像在OpenGL clipping中建议的那样。我成功地实现了对轴对齐的框的节点裁剪。

事实证明,每个节点都必须将其裁剪矩形与使用裁剪的祖先的矩形相交。(如果兄弟姐妹与祖先的剪贴盒重叠,则这是必要的)。

必须使用模具缓冲区实现与非轴对齐矩形相交的机制。我开始在OpenGL clipping中实现建议的解决方案,但是孩子们遇到了问题,他们的剪贴画与他们的祖先重叠。

现在,只需一个剪贴盒就可以完美地剪裁钢模。但是,对于与祖先相交的子或大子,算法失败了,因为这里需要两个涉及的矩形的交集(如轴对齐版)作为掩码,而不是孩子的完整矩形。

我想出了以下算法:

最上面的节点写入从计数器值1开始,并将填充1s的裁剪矩形绘制到模板缓冲区中,并将其子模板测试呈现给1。每个也打开剪贴画的兄弟姐妹通过1添加到模具缓冲区中,然后对2进行测试,从而成为包围矩形。现在,当兄弟姐妹剪裁与祖先重叠时,它们重叠的区域将被填充2s,在对2进行测试时给出完美的裁剪,该算法可以扩展到最多255个嵌套裁剪节点。

我的问题来了:

如何执行对模具缓冲区的呈现,而不是在写入1s时,每当执行呈现时,将1s添加到当前模具缓冲区值中。

这是我用来准备呈现到模具缓冲区的代码:

代码语言:javascript
复制
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, ref, mask);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);

我正在寻找一个设置,它将通过ref的值来增加模具缓冲区当前值,而不是将ref写入缓冲区。

有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-27 14:43:16

glStencilFunc(GL_ALWAYS, ref, mask);说:

  • 第一个参数说,模板比较测试总是成功的,因此第二个和第三个被忽略,但原则上会设置一个常量来比较从模板缓冲区到和哪个位用于比较

的值。

glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);的作用是:

当模具测试失败时,新值替换旧值(根据第一个argument)

  • when深度测试失败,但模具测试通过),新值替换旧的(第二个argument)

  • when模板和深度测试都通过),新值替换旧的(第三个参数)

因此,您正在设置,以便您试图绘制的一切都将通过模具测试,在任何情况下,它的值将被复制到模具缓冲区,无论它是否通过测试。

您可能想要做的是将参数更改为glStencilOp,以便对传递的像素执行GL_INCR。所以在你的模板缓冲区里,你会得到一个'1‘,一个被一个多边形接触的’1‘,一个'2’,你画了两个连续多边形的任何地方,一个' 3‘,你画的任何地方,等等。

在绘制用户可见的内容时,您可以使用类似glStencilFunc设置为GL_GEQUAL的内容,并将传入值与“1”、“2”、“3”等进行比较。

如果您不想跟踪您的深度有多深,假设您将一个剪辑区域绘制到模具中,则可以通过以下方式将其修改为下一个剪辑区域:

  1. GL_INCR绘制所有新的几何图形;这将导致一个模板缓冲区,其中两个区域中的所有像素都有一个'2‘值,而位于一个区域中的所有像素的值都是’1‘
  2. 绘制的一个全屏多边形,只传递给模具基金GL_GREATER和引用值0,用GL_DECR。结果是“0”到处都是从来没有画过或只画过一次的地方,到处都是“1”,每处都画了两次。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7570215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档