13

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

我还能做什么?

4

6 回答 6

22

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

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

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

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

于 2010-08-20T18:21:11.420 回答
13

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

于 2010-08-18T13:31:26.053 回答
5

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

于 2010-08-18T13:26:56.453 回答
5

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

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

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

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

于 2013-07-22T19:46:12.977 回答
0

不能保证GL_LINE_SMOOTHGL_POLYGON_SMOOTH将做任何事情。

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

于 2012-01-18T10:37:10.170 回答
-1

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

于 2015-11-30T20:19:16.163 回答