【问题标题】:How to draw smooth line in OpenGL with antialiasing?如何使用抗锯齿在 OpenGL 中绘制平滑线?
【发布时间】:2011-03-31 13:25:33
【问题描述】:

我需要在 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();

我还能做什么?

【问题讨论】:

    标签: opengl line antialiasing


    【解决方案1】:

    不保证GL_LINE_SMOOTHGL_POLYGON_SMOOTH 会做任何事情。

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

    【讨论】:

    • 呃..为什么?我在哪里可以找到这方面的参考资料?
    • 虽然它们看起来像核心功能,但我的经验是,许多硬件并没有实现这些功能——那些没有始终如一地实现它的硬件,如果它们实现它,性能损失可能相当大.如果您查看 OpenGL 规范文档 - 这些文档为整个库提供了极好的参考,但是您不会在其中找到任何提及,因为它们不是规范的一部分。您可以通过查看 glEnable 的规范在某种程度上确认这一点:khronos.org/opengles/sdk/docs/man/xhtml/glEnable.xml
    【解决方案2】:

    Nanovg 是渲染到 OpenGL 的 2D 绘图包。我已经将它与常规 OpenGL 一起使用来填充和描边 2D 路径和线条。 https://github.com/memononen/nanovg

    【讨论】:

      【解决方案3】:

      您还需要打开混合才能使线条平滑工作。试试:

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

      然后画线。将线宽设置为非整数宽度也可能会有所帮助。

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

      【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

        您可以生成细的、面向屏幕的多边形,并根据到线的距离设置片段的 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 时才这样做。

        【讨论】:

        • 您好 Calvin,我是 OpenGL 新手,不太遵守您的规定:)。你知道我在哪里可以找到一些可以说明你想法的例子吗?谢谢
        • @Stringer Bell 很好的参考,我不知道它也在 gpugems2 中
        • 这不能用渐变纹理、mip 级别和三线性过滤器来完成吗?这样可以避免调用管道的更深和更暗的部分,并且很直观...
        • @jheriko 遗憾的是,不,否则我会提出这个解决方案。
        【解决方案6】:

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

        【讨论】:

        • 你好alxx,我正在使用支持opengl渲染的现有平台。
        • 对不起,这没什么。它使用哪个库?是否有启动 OpenGL 的参数(如颜色深度、模板存在、z 缓冲区大小等)?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-14
        • 2015-08-15
        • 1970-01-01
        • 2020-02-08
        相关资源
        最近更新 更多