Pat*_*gan 22 opengl geometry path line miter
我有一条由2D点列表组成的路径.我想将它们变成一条三角形,以渲染具有指定厚度的纹理线条(和其他类似的东西).因此,2D点的列表基本上需要成为顶点列表,指定多边形的轮廓,如果渲染将呈现该线.问题在于处理拐角连接,斜角,盖帽等.在没有过度拉伸,清洁连接等意义上,所产生的多边形需要是"完美的",以便它可以被挤压或以其他方式玩弄.
是否有任何简单的资源可以提供算法洞察,代码或有效执行此操作的更多信息?
我绝对不想要一个完整的2D矢量库(cairo,antigrain,OpenVG等),包括曲线,弧形,破折号以及所有的铃声和口哨声.我一直在挖掘OpenVG实现和其他东西的多个源代码树以找到一些见解,但它们都非常复杂.
我绝对愿意自己编写代码,但有很多退化情况(小段+粗宽+尖角)会产生各种连接问题.即使是一点点帮助也可以节省我数小时的时间来处理它们.
编辑:这是一个例子,如果你只是从顶点到顶点,那些导致丑陋的退化情况.红色是原始路径.橙色块是以指定宽度绘制的矩形,对齐并以每个段为中心.
哦,好吧 - 我已经尝试自己解决这个问题了。我在一个试图解决零透支问题的解决方案上浪费了两个月的时间。正如您已经发现的,您无法处理所有退化情况并同时实现零透支。
但是,您可以使用混合方法:
为自己编写一个例程,检查是否可以从简单的几何图形毫无问题地构建连接。为此,您必须检查连接角度、线的宽度和连接的线段的长度(比宽度短的线段是 PITA)。通过一些启发式方法,您应该能够解决所有琐碎的情况。
我不知道你的平均线数据是什么样的,但在我的例子中,超过 90% 的宽线没有退化的情况。
对于所有其他线路:
您很可能已经发现,如果您能够容忍过度绘制,则生成几何图形会容易得多。这样做,并让多边形 CSG 算法和曲面细分算法来完成这项艰巨的工作。
我已经评估了大多数可用的曲面细分包,最终选择了 GLU 曲面细分器。它快速、强大、从未崩溃(与大多数其他算法不同)。它是免费的,并且许可证允许我将其包含在商业程序中。曲面细分的质量和速度都还不错。您不会获得 delaunay 三角测量质量,但由于您只需要三角形进行渲染,所以这不是问题。
由于我不喜欢 tesselator API,因此我从免费的 SGI OpenGL 参考实现中提取了 tesselation 代码,重写了整个前端并添加了内存池以减少分配数量。花了两天时间才完成此操作,但这是非常值得的(就像第五因子性能改进一样)。顺便说一句,该解决方案最终以商业 OpenVG 实现的形式出现:-)
如果您在 PC 上使用 OpenGL 进行渲染,您可能需要将曲面细分/CSG 作业从 CPU 移至 GPU,并使用模板缓冲区或 z 缓冲区技巧来消除过度绘制。这比 CPU 曲面细分要容易得多,甚至可能更快。
我刚刚发现了这个了不起的作品:
http://www.codeproject.com/Articles/226569/Drawing-polylines-by-tessellation
它似乎完全符合您的要求,并且其许可证甚至允许在商业应用程序中使用它。另外,作者在详细说明他的方法方面做得非常出色。我可能会在某个时候尝试一下,以取代我自己的不太完美的实现。