关于OpenGL clipping条款中讨论的问题,出现了一个新的问题。
我正在实现一个基于节点的2D场景图的裁剪。每当裁剪框是轴对齐时,我就使用glScissor,就像在OpenGL clipping中建议的那样。我成功地实现了对轴对齐的框的节点裁剪。
事实证明,每个节点都必须将其裁剪矩形与使用裁剪的祖先的矩形相交。(如果兄弟姐妹与祖先的剪贴盒重叠,则这是必要的)。
必须使用模具缓冲区实现与非轴对齐矩形相交的机制。我开始在OpenGL clipping中实现建议的解决方案,但是孩子们遇到了问题,他们的剪贴画与他们的祖先重叠。
现在,只需一个剪贴盒就可以完美地剪裁钢模。但是,对于与祖先相交的子或大子,算法失败了,因为这里需要两个涉及的矩形的交集(如轴对齐版)作为掩码,而不是孩子的完整矩形。
我想出了以下算法:
最上面的节点写入从计数器值1开始,并将填充1s的裁剪矩形绘制到模板缓冲区中,并将其子模板测试呈现给1。每个也打开剪贴画的兄弟姐妹通过将1添加到模具缓冲区中,然后对2进行测试,从而成为包围矩形。现在,当兄弟姐妹剪裁与祖先重叠时,它们重叠的区域将被填充2s,在对2进行测试时给出完美的裁剪,该算法可以扩展到最多255个嵌套裁剪节点。
我的问题来了:
如何执行对模具缓冲区的呈现,而不是在写入1s时,每当执行呈现时,将1s添加到当前模具缓冲区值中。
这是我用来准备呈现到模具缓冲区的代码:
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, ref, mask);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);我正在寻找一个设置,它将通过ref的值来增加模具缓冲区当前值,而不是将ref写入缓冲区。
有人能帮我吗?
发布于 2011-09-27 14:43:16
glStencilFunc(GL_ALWAYS, ref, mask);说:
的值。
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);的作用是:
当模具测试失败时,新值替换旧值(根据第一个argument)
因此,您正在设置,以便您试图绘制的一切都将通过模具测试,在任何情况下,它的值将被复制到模具缓冲区,无论它是否通过测试。
您可能想要做的是将参数更改为glStencilOp,以便对传递的像素执行GL_INCR。所以在你的模板缓冲区里,你会得到一个'1‘,一个被一个多边形接触的’1‘,一个'2’,你画了两个连续多边形的任何地方,一个' 3‘,你画的任何地方,等等。
在绘制用户可见的内容时,您可以使用类似glStencilFunc设置为GL_GEQUAL的内容,并将传入值与“1”、“2”、“3”等进行比较。
如果您不想跟踪您的深度有多深,假设您将一个剪辑区域绘制到模具中,则可以通过以下方式将其修改为下一个剪辑区域:
GL_INCR绘制所有新的几何图形;这将导致一个模板缓冲区,其中两个区域中的所有像素都有一个'2‘值,而位于一个区域中的所有像素的值都是’1‘GL_GREATER和引用值0,用GL_DECR。结果是“0”到处都是从来没有画过或只画过一次的地方,到处都是“1”,每处都画了两次。https://stackoverflow.com/questions/7570215
复制相似问题