1

渲染线条时,如何获取片段到沿线条的整个线条起点的距离(以像素为单位)?

当在 3D 中渲染两个点之间的单个线段时,屏幕空间中这两个点之间的距离就是它们的 2D 投影之间的欧几里得距离。如果我渲染这个片段,我可以插入(GLSL 中的布局限定符 noperspective)从起点到每个片段的线的起点的屏幕空间距离。

但是,在渲染线条时,这不起作用,因为在几何着色器中,我只有有关当前段的起点和终点的信息,而不是所有先前段的信息。所以我用上面的方法可以计算的只是每个片段到线段起点的距离,而不是到线段起点的距离。但这就是我想要实现的。

我需要它来做什么:程式化的线条渲染。例如,根据屏幕覆盖率(以像素为单位的长度)为折线着色,每 50 个像素添加一个距离标记,沿线带交替多个纹理,...

我目前做的是:

  • 预先将线的每个点投影到 CPU 上
  • 以像素为单位计算所有投影线段的长度
  • 将长度作为顶点属性存储在缓冲区中(顶点 0 的距离为 0,顶点 1 的长度为 0->1,顶点 2 的长度为 0->1 + 1->2,...)
  • 在几何着色器中,创建线段并使用在 CPU 上计算的距离
  • 为每个片段插入没有透视校正的值

这行得通,但必须有更好的方法来做到这一点。每帧在 CPU 上投影几百或几千个线点是不可行的。在几何着色器中是否有一种聪明的方法来计算它?我所拥有的是当前线段起点和终点的世界空间位置,我有两个点到沿线的线带起点的世界空间距离(同样是顶点属性0、0- >1, 0->1 + 1->2, ...) 并且我可以提供关于线带的任何其他统一数据(以世界空间单位表示的总长度,线段数,...)。

编辑:我不想计算到线段起点的欧几里得距离,而是计算沿整条线的距离,即到当前片段的所有投影线段的长度之和。

4

2 回答 2

0

我看到两种方法:

您可以使用顶点着色器。添加线带的起始坐标作为线的每个顶点的附加值。然后顶点着色器可以计算到起点的距离,并将它们插值传递给片段着色器。在那里你必须重新调整它们以接收像素值。

或者,您可以使用制服告诉顶点着色器每条线的起始坐标。在那里,您需要像转换顶点坐标一样转换它们并将它们移向片段着色器。在那里,您必须将它们转换为像素坐标并计算到实际片段的距离。

于 2014-09-24T13:28:32.933 回答
0

我以为我只是在这里遗漏了一些东西,我的任务可以通过简单的透视计算魔法来解决。感谢 derhass 指出我的探索毫无意义。

与往常一样,提出问题已经解决了一半。当您知道要寻找什么(“直线的连续参数化”)时,您会偶然发现这篇论文

福雷斯特·科尔和亚当·芬克尔斯坦。高质量线条可见性的两种快速方法。IEEE Transactions on Visualization and Computer Graphics 16(5),2010 年 2 月。

它解决了这个问题。该解决方案类似于 derhass 已经提出的解决方案。Cole 和 Finkelstein 使用他们在 GPU 上按帧计算的分段图集。它包括所有投影线点的列表(以及其他属性,例如可见性),以跟踪每个片段沿线的位置。该片段图集是在帧缓冲区中计算的,因为论文(草稿)可以追溯到 2009 年。在计算着色器中实现相同的方法并将结果存储在缓冲区中似乎是可行的方法。

于 2014-09-25T13:38:09.477 回答