渲染线条时,如何获取片段到沿线条的整个线条起点的距离(以像素为单位)?
当在 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, ...) 并且我可以提供关于线带的任何其他统一数据(以世界空间单位表示的总长度,线段数,...)。
编辑:我不想计算到线段起点的欧几里得距离,而是计算沿整条线的距离,即到当前片段的所有投影线段的长度之和。