【发布时间】:2016-04-20 15:59:45
【问题描述】:
我想在 WebGL 中渲染任意粗细的线条。环顾四周,最好的方法似乎是为 TRIANGLE_STRIP 生成几何图形。 我的线条在每一帧中都会更新(它们基本上是模拟的绳索),而且我已经受到 cpu 的严重限制,所以我希望在 gpu 上做尽可能多的工作,在 cpu 上做尽可能少的工作。
因此,据我了解,要做的最少工作是将每个点的缓冲区推送两次和一个索引,以便顶点着色器可以将它们分开。 我可以使用斜接接头。
但我想要圆形接头。然而,我在谷歌上找到的所有东西都谈到了在关节区域生成的额外三角形并将它们推送到 cpu。由于 WebGL 没有几何着色器,因此没有明显的方法可以将这个概念放到 gpu 上。 TRIANGLE_STRIP 中的线之间共享顶点这一事实并没有使这变得更容易。
我当前的解决方案是使由 A 和 B 之间的线产生的片段的片段着色器具有从 A 插值到 B,从 B 插值到 A 的变量,并且可以判断它在插值中的位置。这给了我 2 个未知值和 2 个方程。解决它们会在片段着色器中给我 A 和 B。由于 TRIANGLE_STRIP 重用顶点,因此正确处理比一开始听起来要复杂得多,并且在中间和插值边缘的准确性方面存在一些小问题(尽管我可以接受)。 这是一个相当复杂的解决方案。
是否有通过着色器渲染圆线关节的“通用”解决方案? 像three.js 这样的大库如何处理这个问题?我试图搜索他们的来源,但这是一个大项目;)
【问题讨论】:
-
在末端丢弃靠近顶点的片段,(其中接近并不意味着欧几里德距离,而是产生倒圆/双曲线的东西),然后添加一些平滑度等......
-
不知何故使用线顶点和片段之间的距离是我也在考虑的,但我还没有找到一种非常直接的方法来制作它,以便每个片段都知道它需要哪些顶点考虑。
-
这是 2D 还是 3D?
-
编辑标题:2D 还添加了一些关于我现在正在做什么的信息......
标签: javascript three.js webgl