1

我正在尝试在 OpenGL 中绘制一条或多或少平滑的多段线。但是我发现如果线的厚度超过 3 左右,那么线段之间的连接就不是无缝的。他们之间有时会有差距。有没有一种使这些连接平滑无间隙的好方法?我正在寻找类似于 Java 中的 BasicStroke.JOIN_MITER 的东西。

4

6 回答 6

5

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

话虽如此,我已经使用了一个简单的 2 pass hack 来解决这个问题。

  1. 禁用写入深度缓冲区 glDepthMask(GL_FALSE)
  2. 绘制所需厚度的平滑线
  3. 在所有线的端点处绘制相同大小的平滑点。(可能不需要此步骤来填补空白,但它应该使线条相交的点变圆并使一切看起来更平滑)
  4. 重新启用深度缓冲区以写入 glDepthMask(GL_TRUE)

您可能还想尝试使用深度缓冲区设置。行之间的“间隙”可能是由于第二行未能对已与背景混合的 alpha 像素进行深度测试。

于 2009-05-11T13:38:24.060 回答
1

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

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

于 2009-05-07T21:12:03.203 回答
1

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

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

于 2009-05-07T21:16:10.477 回答
1

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

于 2010-02-18T15:53:58.780 回答
0

在每一端过度绘制线的一半厚度。这应该消除“间隙”,尽管它会提供更清晰的线连接而不是更平滑的连接。

于 2009-05-07T21:09:42.163 回答
0

要获得平滑的效果,您可能需要使用贝塞尔曲线或其他形式的样条曲线。我很惊讶这不是 OpenGL 内置的,但是该网站有一个示例程序可以使用 OpenGL 生成 Bezier 曲线

于 2009-05-07T21:51:54.167 回答