【发布时间】:2013-05-16 08:19:40
【问题描述】:
所以,首先,我不太擅长计算机图形学。我正在尝试实现一个 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 位置相同的图层按添加顺序(先进先出)绘制。
对不起,如果我在最初的问题中没有说清楚。
【问题讨论】:
-
根据解决方案需要的通用性,有问题的概述here(来自 OpenGL POV)。
-
+1 只是为了展示这个。虽然有人可能会争辩说这是一个你尝试过的问题,箭头后面有合理的木头,但很明显一些想法已经进入了这个问题。我不会编写 GL 图形来挽救我的生命,我真的对这个问题很感兴趣。
-
请问您通过不使用 GPU 来实现此目的是为了实现什么? OpenGL 或其他风格的 API 将使这更容易和可移植。
-
@Michael Dorgan:这意味着可以在多个平台上工作,其中一些平台没有任何 OpenGL 功能,只能填充 2D 纹理多边形(有些甚至没有 GPU ,所以这必须在纯软件中完成)。这个想法是有一种通用的方式来构建场景图,然后让后端绘制多边形。
-
这将迫使您使用最小公分母样式编码。在 Color Gameboy 风格的图形上运行 Xbox360 不会很受欢迎。这可能是您想要为低端系统执行 OpenGL 解决方案和“假”解决方案的情况。