OpenGL:3D中厚而光滑/不折断的线条*

vic*_*ann 2 opengl glsl openscenegraph

我有一个类似3D CAD的应用程序,我使用OpenGL包装器库(OpenSceneGraph).对于应用程序,我试图提出如何在3D中渲染粗细线条的最佳策略.

通过厚,光滑我的意思是:

  • 线条粗细可以超过OpenGL最大线宽值(它似乎10.f在我的机器上)
  • 在组成折线时,我想避免看到"折线"(见下面的示例图片)

OpenGL <code>GL_LINE_STRIP_ADJACENCY</code>.</p>

<p>我发现有很多不同的资源可以在2D中渲染漂亮的线条和曲线.最简单的方法是不需要太多思考就是将该行渲染为一组四边形(<code>GL_QUAD_STRIP</code>).这个解决方案的好处是它同时解决了我的两个问题.</p>

<p>作为一个例子,我还发现这个<a rel=漂亮的库可以实现广泛的线条和曲线外观.它使用三角形进行渲染.

注意:我不寻求像顶点着色或类似笔刷的笔触这样的奇特效果,只是一个3D线段,它可以具有较大的厚度,并且与另一个线段连接良好,它们之间没有任何间隙.

这些2D方法的问题在于它们是2D.当我改变视点时,很明显我的线条几何形状不是线条,而是2D"条带"位于某些3D平面中.我希望它们看起来像3D线条.

在考虑问题时,我只能提出以下方法:

  1. 将线渲染为一组2D四边形(三角形),然后使它们始终面向相机
  2. 使用像圆柱体这样的3D形状来表示线段

我不确定两种解决方案中的任何一种是否可行(我是OpenGL的初学者).我可能在场景中有数百甚至数千个折线.我也想知道是否有更好,更聪明的方法来解决这个问题?我对任何事情持开放态度,对最有效的方式感兴趣.谢谢.

编辑:正如用户@rickyviking指出的那样,我没有明确说明我正在寻找2D外观(就像任何类似CAD的应用程序一样),这意味着:线条的粗细不取决于距离的近/远相机就在他们身边.

更新:感谢@rickyviking的回答,我选择了方向移动 - 几何着色器.我仍然没有完整的解决方案,但可能会在结果发布后发布最终更新和最小代码.

vic*_*ann 6

我最终使用了几何着色器,如其中一个答案所示.主要思想是将每个线段转换为三角形条带,并确保它始终面向相机,厚度保持不变.

我还写了一篇关于实现细节的博客文章.如果有人发现它有用,我将着色器代码放在我的一个github repos上(该代码还提供了如何使用相同的技术绘制厚而光滑的Bezier曲线的示例).

以下是一些结果截图(使用着色器绘制绿线,使用红色绘制GL_LINE_STRIP_ADJACENCY):

相同厚度的例子

更厚的例子

注意红线的相邻线段之间的间隙与绿线相比.

两条Bezier曲线(全部使用着色器绘制):

贝塞尔曲线的例子


ric*_*ing 3

首先,您需要弄清楚您所追求的结果应该“看起来”是 2D 还是 3D。

当您提到圆柱体时,它们肯定会具有“3D 效果”(距离较远的几何体比靠近视点的几何体更薄/更小),但这并不是 CAD 类应用程序通常的样子。
我相信您追求的是 2D 外观结果,其中线条的宽度与其距视点的距离无关。

当使用像您提到的那样的库时,每次更改视角(可能是每一帧)时都应该重新计算几何图形,以使它们始终面向屏幕平面。

另一种性能更好的方法是使用“实线框”技术,这是NVidia 的实现,它使用几何着色器(您可以找到几个有关如何在 OpenSceneGraph 中使用它们的示例)。
其他类似的技术如下所示: https: //forum.libcinder.org/topic/smooth-thick-lines-using-geometry-shader