vic*_*ann 2 opengl glsl openscenegraph
我有一个类似3D CAD的应用程序,我使用OpenGL包装器库(OpenSceneGraph).对于应用程序,我试图提出如何在3D中渲染粗细线条的最佳策略.
通过厚,光滑我的意思是:
10.f在我的机器上)
漂亮的库可以实现广泛的线条和曲线外观.它使用三角形进行渲染.
注意:我不寻求像顶点着色或类似笔刷的笔触这样的奇特效果,只是一个3D线段,它可以具有较大的厚度,并且与另一个线段连接良好,它们之间没有任何间隙.
这些2D方法的问题在于它们是2D.当我改变视点时,很明显我的线条几何形状不是线条,而是2D"条带"位于某些3D平面中.我希望它们看起来像3D线条.
在考虑问题时,我只能提出以下方法:
我不确定两种解决方案中的任何一种是否可行(我是OpenGL的初学者).我可能在场景中有数百甚至数千个折线.我也想知道是否有更好,更聪明的方法来解决这个问题?我对任何事情持开放态度,对最有效的方式感兴趣.谢谢.
编辑:正如用户@rickyviking指出的那样,我没有明确说明我正在寻找2D外观(就像任何类似CAD的应用程序一样),这意味着:线条的粗细不取决于距离的近/远相机就在他们身边.
更新:感谢@rickyviking的回答,我选择了方向移动 - 几何着色器.我仍然没有完整的解决方案,但可能会在结果发布后发布最终更新和最小代码.
我最终使用了几何着色器,如其中一个答案所示.主要思想是将每个线段转换为三角形条带,并确保它始终面向相机,厚度保持不变.
我还写了一篇关于实现细节的博客文章.如果有人发现它有用,我将着色器代码放在我的一个github repos上(该代码还提供了如何使用相同的技术绘制厚而光滑的Bezier曲线的示例).
以下是一些结果截图(使用着色器绘制绿线,使用红色绘制GL_LINE_STRIP_ADJACENCY):
注意红线的相邻线段之间的间隙与绿线相比.
两条Bezier曲线(全部使用着色器绘制):
首先,您需要弄清楚您所追求的结果应该“看起来”是 2D 还是 3D。
当您提到圆柱体时,它们肯定会具有“3D 效果”(距离较远的几何体比靠近视点的几何体更薄/更小),但这并不是 CAD 类应用程序通常的样子。
我相信您追求的是 2D 外观结果,其中线条的宽度与其距视点的距离无关。
当使用像您提到的那样的库时,每次更改视角(可能是每一帧)时都应该重新计算几何图形,以使它们始终面向屏幕平面。
另一种性能更好的方法是使用“实线框”技术,这是NVidia 的实现,它使用几何着色器(您可以找到几个有关如何在 OpenSceneGraph 中使用它们的示例)。
其他类似的技术如下所示: https: //forum.libcinder.org/topic/smooth-thick-lines-using-geometry-shader