OpenGL中的线条流畅

时间:2009-05-07 21:06:54

标签: java opengl jogl

我正在尝试在OpenGL中绘制一个或多或少平滑的多段线。然而,我发现如果线的厚度大约为3,则段之间的连接不是无缝的。他们之间有时会有差距。是否有一种很好的方法可以使这些连接平滑无间隙?我正在寻找类似于Java中的BasicStroke.JOIN_MITER的东西。

6 个答案:

答案 0 :(得分:5)

使用OpenGL绘制思考线的最一致和最便携的方法是使用相机对齐(否则称为广告牌)多边形。 OpenGL API的不同实现以不同方式处理行的端点,GL_LINE_SMOOTH根据平台产生截然不同的结果。一些实现认为厚度大于1的线是不明确的。如glLineWidth联机帮助页中所述:[对于抗锯齿线条]仅保证支持宽度1;其他人则依赖于实施。

话虽这么说,我已经使用了一个简单的2通道黑客来解决这个问题。

  1. 禁止写入深度缓冲区glDepthMask(GL_FALSE)
  2. 绘制所需厚度的平滑线条
  3. 在线条上相同大小的所有线条的端点处绘制平滑点。 (这个步骤可能不需要填补空白,但它应该使线条相交的点变圆并使一切看起来更平滑)
  4. 重新启用深度缓冲区以写入glDepthMask(GL_TRUE)
  5. 您可能还想使用深度缓冲设置。这些线之间的“间隙”可能是由于第二行未能对与背景进行alpha混合的像素进行深度测试。

答案 1 :(得分:1)

根据OpenGL实施的质量,结果可能会有所不同。我注意到不同实现中的平滑线有很多不同。

您可能希望使用不同的策略来绘制线段,例如使用细多边形。

答案 2 :(得分:1)

使用GL_LINE_SMOOTH启用消除锯齿会改变略微绘制线条的方式。你可以尝试一下。另请注意,需要启用混合才能使其正常工作。

最重要的是,您无法控制使用细长方形绘制线条的各个方面可能会更好,并且在您编写自己的DrawThickLine函数后,它将不再是任何工作..

答案 3 :(得分:1)

绘制四边形,并使用纹理或片段着色器来点画。片段着色器也可以提供抗锯齿。

答案 4 :(得分:0)

将每条线的厚度拉过一半。这应该删除'间隙',虽然它会提供更清晰的线连接而不是更平滑的线连接。

答案 5 :(得分:0)

为了获得平滑的效果,您可能需要求助于Bezier曲线或其他形式的样条曲线。我很惊讶这不是内置于OpenGL中,但该网站有一个example program to generate Bezier curves using OpenGL