OpenGL ES模板操作

在参考OpenGL文章中讨论的问题后,出现了一个新的问题。

我正在实现基于节点的2D场景图的裁剪。 每当剪辑框轴alignment,我正在使用像在OpenGL剪辑中提出的glScissor。 我已经成功实现了轴alignment框的节点裁剪。

事实certificate,每个节点必须与它的裁剪矩形的剪切矩形相交。 (对于与祖先的剪贴框重叠的兄弟姐妹,这是必要的)。

交叉非轴alignment矩形的机制必须使用模板缓冲区来实现。 我开始在OpenGL剪辑中实现所提出的解决scheme,但是在chidrens中存在剪辑反转与其祖先重叠的问题。

现在,模板剪裁只用一个剪辑框就完美了。 但是,对于与祖先相交的小孩或大孩子来说,algorithm会失败,因为这里需要包含2个矩形的交点(如轴alignment版本),而不是孩子的全矩形。

我已经想出了以下algorithm:

最上面的节点写入从计数器值1开始,并将其填充1的剪切矩形绘制到模板缓冲区中,并将其模板化testing的结果显示为1.每个同时具有剪裁的兄弟模型都会打开它的边界矩形,模板缓冲区,然后testing2等等。 现在,当一个兄弟剪裁matrix与一个祖先剪裁matrix重叠时,它们重叠的区域会被2s填充,在对2进行testing时给出完美剪辑。该algorithm可以扩展到最多255个嵌套剪辑节点。

这里是我的问题:

如何执行对模板缓冲区的渲染,而不是1s正在写入,每当执行渲染时,都将1s添加到当前模板缓冲区值。

这是我用来准备渲染到模板缓冲区的代码:

glEnable(GL_STENCIL_TEST); glStencilFunc(GL_ALWAYS, ref, mask); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); 

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

有人可以帮我吗?

glStencilFunc(GL_ALWAYS, ref, mask); 说:

  • 第一个参数说模板比较testing总是成功的
  • 第二个和第三个被忽略,但是原则上会设置一个常数来比较来自模板缓冲区的值和哪个比特用于比较

glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); 有这样的效果:

  • 当模板testing失败时,新值将replace旧的(根据第一个参数)
  • 当深度testing失败,但模板testing通过时,新值replace旧的(每第二个参数)
  • 当模板和深度testing都通过时,新值replace旧的(每第三个参数)

所以你正在设置的东西,所以你试图绘制的一切都将通过模具testing,并在任何情况下,它的价值将被复制到模板缓冲区,无论是否通过testing。

也许你想要做的就是改变你的参数glStencilOp以便您通过像素执行GL_INCR 。 所以在你的模板缓冲区中,最终会有一个“1”在任何地方接触到一个多边形,一个“2”在任何地方你绘制了两​​个连续的多边形,一个“3”在任何地方你画了3等。

当绘制用户可见的东西,你可以使用像glStencilFunc设置为GL_GEQUAL并比较传入的值'1','2','3'或其他。

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

  1. GL_INCR绘制所有新的几何graphics; 这将导致一个模板缓冲区,其中在两个区域中的所有像素具有值“2”,并且仅在一个区域中的所有像素具有值“1”
  2. 绘制一个全屏多边形,只能用模板基金GL_GREATER和参考值0与GL_DECR一起GL_DECR 。 结果是“0”,从来没有画过或只涂了一次,到处都涂了两次。
Interesting Posts