如何在OpenGL中使用抗锯齿技术来画出平滑的线条?

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();

我还能做什么?

6个回答

24

您还需要启用混合才能使线条平滑处理起作用。请尝试:

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

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

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


很酷,这正是我所缺少的。 - Janko
我正在使用这些代码行,但效果不是很好。请查看我的问题:http://stackoverflow.com/questions/30726077/page-curl-with-best-quality - Dr.jacky

15
你可以生成适合屏幕显示的细多边形,并根据其到线的距离设置片段的透明度。
示例:
   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的新手,不太理解你的术语:)。你知道在哪里可以找到一些例子来说明你的想法吗?谢谢 - q0987
@Stringer Bell 很好的参考,我不知道它也在gpugems2中。 - Calvin1602
这个不能用渐变纹理、MIP级别和三线性过滤来实现吗?这样可以避免调用管道中更深和更暗的部分,而且我认为很直观... - jheriko
@jheriko 很遗憾,否则我会提出这个解决方案的。 - Calvin1602

5

仅使用GL_POLYGON_SMOOTH是没有用的。在创建OpenGL上下文时,需要强制执行抗锯齿。您使用什么来创建OpenGL窗口?请查看其参数是否支持抗锯齿。或者,您可以使用Nvidia或ATI工具为所有OpenGL程序强制启用抗锯齿……这都取决于您的设置。


你好alxx,我正在使用一个支持OpenGL渲染的现有平台。 - q0987
3
抱歉,这并没有说明问题。它使用哪个库?有没有用于启动OpenGL的参数(例如颜色深度、模板存在性、z缓冲区大小等)? - alxx

5
作为另一篇答案提到的,启用抗锯齿可以帮助——如何启用取决于您的上下文创建,但是对于GLFW用户而言,这些信息将有所帮助。
如果使用GLFW 2: glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4); 如果使用GLFW 3: glfwWindowHint(GLFW_SAMPLES, 4); ...或者您喜欢的任何抗锯齿采样数量。以上提示需要在打开GLFW窗口之前设置。

0

不能保证GL_LINE_SMOOTHGL_POLYGON_SMOOTH会有任何作用。

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


2
嗯,为什么?我在哪里可以找到关于这个的参考资料? - nkint

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接