【发布时间】:2014-09-25 21:38:09
【问题描述】:
在渲染线条时,如何获取片段沿线条到整个线条起点的距离(以像素为单位)?
在 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, ...) 并且我可以提供关于线带的任何其他统一数据(世界空间单位的总长度,线段数,...)。
编辑:我不想计算到线带起点的欧几里得距离,而是沿整条线的距离,即总和直到当前片段的所有投影线段的长度。
【问题讨论】:
-
这在顶点或几何着色器中不会以任何合理的方式工作,因为这会引入不同着色器调用之间的依赖关系,因为您需要累积“先前”段的长度。您需要在渲染之前预先计算。这并不意味着这不能并行完成,因为您原则上可以并行计算每个段的长度,然后将它们分层汇总。这可以通过计算着色器来完成。使用带有变换反馈的多次传递也可能有效。但是这两种方法都不是直截了当的。
标签: opengl glsl geometry-shader