GLSL中沿线条的屏幕空间距离

时间:2014-09-24 12:30:35

标签: opengl glsl geometry-shader

渲染线条时,如何沿着像素线获取片段到整个条带起点的距离?

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

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

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

我目前所做的是:

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

这有效,但必须有更好的方法来做到这一点。每帧在CPU上投射几百或几千个线点是不可行的。有几种智能方法可以在几何着色器中计算它吗?我所拥有的是当前线段的起点和终点的世界空间位置,我有两个点的世界空间距离到线条的起点沿线(再次是顶点属性0,0- > 1,0-> 1 + 1> 2,......)我可以提供关于线条的任何其他统一数据(世界空间单位的总长度,段数......)。 / p>

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

2 个答案:

答案 0 :(得分:0)

我看到两种方式:

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

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

答案 1 :(得分:0)

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

与往常一样,制定问题已经成为解决方案的一半。当您知道要查找的内容时(“行的连续参数化”),您可以偶然发现paper

  

Forrester Cole和Adam Finkelstein。高质量线可见性的两种快速方法。 IEEE可视化与计算机图形学交易16(5),2010年2月。

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