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

q09*_*987 13 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();
Run Code Online (Sandbox Code Playgroud)

我还能做什么?

Gre*_*hen 22

您还需要启用混合以使线条平滑工作.尝试:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)

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

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


Cal*_*602 12

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

示例:

   a (0,1)                                  b (0,1)
    +--------------------------------------+
  A |                                      | B
----+--------------------------------------+----
    |                                      |  
    +--------------------------------------+
   d (0,0)                                  c (0,0)
Run Code Online (Sandbox Code Playgroud)

假设您要绘制段[AB].

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

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

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


alx*_*lxx 5

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

  • 对不起,没有说什么.它使用哪个库?是否有启动OpenGL的参数(如颜色深度,模板存在,z缓冲区大小等)? (3认同)

Rio*_*iot 5

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

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

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

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