所以,首先,我不太擅长计算机图形学。我正在尝试实现一个 GUI 工具包,其中一个功能是能够将 3D 转换应用于 2D“层”。(一个图层只有一个 Z 坐标,作为预变换,它是一个二维轴对齐的矩形)
现在,这非常简单,直到您遇到将图层向后推的 3D 转换,需要将图层拆分为多个多边形才能正确渲染,如此处所示。而且因为我们可以有透明度,所以图层可能不会完全被遮挡,但仍然需要拆分。
所以这里有一个描述问题和预期结果的插图。在这种情况下,蓝色层(称为B)位于红色层(R)的顶部,同时具有相同的 Z 位置(但B是在R之后添加的)。在这种情况下,如果我们旋转B,它的顶部两个点的 Z 索引将低于 0,而底部点的索引将高于 0(锚点是唯一剩下的点/线为 0)。
有人可以建议在 CPU 上执行此操作的好方法吗?我一直在努力寻找适合这种情况的合适算法实现(在 C++ 或 C 中)。
编辑:为了澄清我自己,在管道的这个阶段,还没有渲染。我们只需要为每一层生成一组多边形,然后代表层的变换和遮挡几何。然后,如果需要,渲染(软件或硬件)会在需要时完成,但情况并非总是如此(例如,在进行命中测试时)。
编辑 2:我将二进制空间分区视为实现此目的的一种选择,但我只能找到一个实现(在 中GL2PS
),我不确定如何使用它。我对 BSP 的工作原理有一个模糊的理解,但我不确定它们如何用于遮挡剔除。
编辑 3:我不想在这个阶段进行颜色和透明度混合。只是纯几何。透明度可以由渲染器处理,过度绘制是可以的。在这种情况下,蓝色的多边形可以只画在红色的下面,但是对于更复杂的情况,可能需要深度排序甚至拆分多边形(如下面的可怕案例示例)。虽然视口是固定的,但由于所有图层都可以进行 3D 变换,因此可以创建如下所示的形状。
所以我真正在寻找的是一种算法,它将B层几何分割成两个蓝色形状,其中一个将绘制在“上方”,其中一个将绘制在R下方。“下面”的部分会透支,是的,但这不是主要问题。所以B只需要被分成两个多边形,这样当这些多边形按顺序绘制时,它就会穿过R。无需担心混合。
编辑 4:为此,我们根本无法渲染任何东西。这一切都必须以纯几何方式完成(生成2D多边形)。这就是我最初的目的。
编辑 5:我应该注意到每个子场景的四边形总数约为 30(平均)。绝对不会超过 100。除非图层经过 3D 转换(这是出现此问题的地方),否则它们只是在绘制之前按 Z 位置排序的基数。具有相同 Z 位置的图层按添加顺序(先进先出)绘制。
抱歉,如果我在原始问题中没有说清楚。