Opengl es OpenGL裁剪

Opengl es OpenGL裁剪,opengl-es,clipping,bounding-box,Opengl Es,Clipping,Bounding Box,我已经读了好几个小时关于剪辑的文章,但我似乎没有找到解决问题的办法 这是我的设想: 在OpenGL ES环境(IOS、Android)中,我有一个由可绘制对象组成的2D场景图,形成一棵树 每个树节点都有自己的空间空间和自己的变换矩阵,每个节点都将其坐标空间继承给其子节点。每个节点都有一个矩形边界框,但这些边界框不是轴对齐的 此设置非常适合渲染2D场景图,遍历树,渲染每个对象,然后再渲染其子对象 现在我的问题来了:我正在寻找一种在节点上启用剪辑的方法。启用剪裁后,在离开父节点的边界框区域时,应剪裁

我已经读了好几个小时关于剪辑的文章,但我似乎没有找到解决问题的办法

这是我的设想:

在OpenGL ES环境(IOS、Android)中,我有一个由可绘制对象组成的2D场景图,形成一棵树

每个树节点都有自己的空间空间和自己的变换矩阵,每个节点都将其坐标空间继承给其子节点。每个节点都有一个矩形边界框,但这些边界框不是轴对齐的

此设置非常适合渲染2D场景图,遍历树,渲染每个对象,然后再渲染其子对象

现在我的问题来了:我正在寻找一种在节点上启用剪辑的方法。启用剪裁后,在离开父节点的边界框区域时,应剪裁节点的子节点

例如,我希望有一个节点包含一组文本节点作为子节点,可以使用其父边界框上下滚动,并且在离开父边界框区域时应进行剪裁

因为边界框不是轴对齐的,所以我不能使用glScissor,这是最简单的方法

我正在考虑使用模具缓冲区,并在启用剪切后将填充的边界矩形绘制到其中,然后启用模具缓冲区。这可能会起作用,但会导致另一个问题:如果被剪裁节点中的子节点再次进行剪裁,会发生什么情况必须为子对象设置模板掩码,以擦除父对象模板掩码

我想到的另一个解决方案是在软件中进行剪辑。这是可能的,因为在每个节点中,剪裁可以相对容易地在其自身的局部坐标空间中完成。此解决方案的背景是,必须为实现的每个新节点类型实现剪裁

这里有人能给我指出正确的方向吗?
我想要的是类似于GLSCISOR的功能,用于剪裁非轴对齐的矩形区域。

剪刀盒是一个简单的工具,可以满足简单的需要。如果您的需求不那么简单,那么您将不得不使用不那么简单的OpenGL裁剪机制:模具缓冲区

假设您目前没有对任何其他内容使用模具缓冲区,则可以访问8个模具位。通过为场景图形中的每个级别指定比上一个级别更高的数字,可以为每个级别指定其自己的模具遮罩。当然,如果同一深度级别上的两个同级重叠,或者太近,那么您就有问题了

另一种方法是为每个节点分配一个从1到255的数字。使用GL_EQUAL的模具测试,您将能够防止上述重叠问题。但是,这意味着在整个场景图中最多只能有255个节点。根据您的特殊需要,这可能是一个太多的限制

当然,当您通过任何一种方法用完位时,您都可以清除模具(和深度。不要尝试只清除其中一个)。但这可能会有点昂贵,并且需要清除深度,这可能是您不想做的


另一种方法是仅对非轴对齐节点使用递增数和GL_相等测试。对大多数节点使用剪刀框,但如果存在一些旋转(无论是在该节点上还是继承的),则使用模具遮罩,在处理图形时碰撞遮罩计数器。同样,限制为256个节点,但至少这些节点仅适用于旋转的节点。根据您的需要和旋转节点的数量,这可能就足够了。

随着数量的增加,我仍然不明白这一点。假设第一个启用了剪裁的节点在模具缓冲区中绘制了一个1的矩形,他的兄弟节点将被完美剪裁。现在又出现了另一个启用了剪辑的兄弟。它在模具缓冲区中绘制一个填充2的矩形,替换2个矩形重叠的1。兄弟姐妹们也将被完美剪掉,因为他们将再次接受测试。现在我们转到第一个节点,它必须根据1进行模具测试。这里的测试将失败,因为我们针对1进行测试,并且第一个矩形的某些部分已被2s覆盖。如果我误解了你的想法,请纠正我@NULL在绘制子节点之前,每个节点都应该绘制自己的内容。因此,只有当同一父项下的两个兄弟姐妹重叠时,这个问题才有意义。如果他们这样做了,那么正确的事情就会发生:一个重叠赢,另一个输。兄弟姐妹之间应该互相夹住,因此,其中一个必须获胜。与GUI层次结构一样,节点下的同级具有Z顺序。您只需维持此顺序并适当地绘制它们。@NULL此外,您还可以在模具测试中使用GL_LEQUAL来确保剪切发生在某个点之上,但在其他点之下。只要为所有家长分配的模具值小于其子女的模具值,就可以正常工作。@NICOLAS BOLAS感谢您的输入。我成功地实现了节点和祖先轴对齐的情况。我需要更多关于模具版本的帮助。我几乎让它工作了,但我需要一个不同的算法。我已经编辑了原始帖子,并描述了我的算法和我在那里遇到的问题。