如何使用抗锯齿在OpenGL中绘制平滑线?

时间:2010-08-18 13:16:21

标签: opengl line antialiasing

我需要在OpenGL中绘制一条平滑的线,这就是我所做的:

glEnable( GL_LINE_SMOOTH );
glEnable( GL_POLYGON_SMOOTH );
glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
glHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );
glBegin( GL_LINE_STRIP );
    for( UINT uiPoint = 0; uiPoint < iNumPoints; ++uiPoint )
    {
        const Coord &Node = vecPoints[uiPoint];
        glVertex3f( Node.x, Node.y, Node.z );
    }
glEnd();

我还能做些什么?

6 个答案:

答案 0 :(得分:22)

您还需要启用混合以使线条平滑处于工作状态。尝试:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

然后绘制线条。将线宽设置为非整数宽度也可能有帮助。

正如其他人所提到的,这不会使多边形边缘平滑,但会产生抗锯齿线。

答案 1 :(得分:12)

您可以生成薄的,面向屏幕的多边形,并根据到线的距离设置片段的alpha。

示例:

   a (0,1)                                  b (0,1)
    +--------------------------------------+
  A |                                      | B
----+--------------------------------------+----
    |                                      |  
    +--------------------------------------+
   d (0,0)                                  c (0,0)

假设您要绘制段[AB]。

  • 改为绘制多边形abcd
  • 映射UV((0,0),(0,1))
  • 绑定仅在中心
  • 上的白色8x1黑白纹理
  • 使用从纹理
  • 设置gl_FragColor.a的片段着色器进行渲染

(或多或少是ShaderX5中使用的技术)

但只有在您不能使用MSAA时才这样做。

答案 2 :(得分:5)

GL_POLYGON_SMOOTH本身对你没有好处。创建OpenGL上下文时,需要强制进行抗锯齿处理。你用什么来创建OpenGL窗口?看它是否支持其参数中的抗锯齿。或者你可以使用Nvidia或ATI工具强制所有OpenGL程序的抗锯齿......这一切都取决于你的设置。

答案 3 :(得分:4)

正如另一个提到的答案,启用抗锯齿有帮助 - 如何启用这取决于您的上下文创建,但此信息有望用于GLFW用户。

如果使用GLFW 2: glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4);

如果使用GLFW 3: glfwWindowHint(GLFW_SAMPLES, 4);

...或您喜欢的任何数量的抗锯齿样本。在打开GLFW窗口之前,需要设置上述提示。

答案 4 :(得分:1)

无法保证GL_LINE_SMOOTHGL_POLYGON_SMOOTH可以执行任何操作。

虽然它们看起来像核心功能,但我的经验是许多硬件没有实现这些 - 那些没有实现它的一致,如果它们确实实现了它,性能损失可能相当大。如果你看一下OpenGL规范文档 - 它们为整个库提供了很好的参考,但是你不会在那里找到任何提及它们,因为它们不是规范的一部分。您可以通过查看glEnable的规范在某种程度上确认这一点:khronos.org/opengles/sdk/docs/man/xhtml/glEnable.xml

答案 5 :(得分:-1)

Nanovg是一个2D绘图包,可呈现给OpenGL。我将它与常规OpenGL一起用于填充和描边的2D路径和线条。 https://github.com/memononen/nanovg