是否可以在OpenGL中对别名进行反别名?

时间:2011-10-17 11:53:40

标签: opengl graphics antialiasing

我在OpenGL中绘制了一些2D线(使用AGL API)。我已使用GL_LINE_SMOOTH启用了线路抗锯齿功能,并将GL_LINE_SMOOTH_HINT设置为GL_NICEST

例如,这里是对角线 * 的放大视图:

Line with anti-aliased edges http://whileyouweregone.co.uk/images/stackoverflow/good-aa.png

然而,问题是我的代码绘制了一些由大量垂直线构成的形状,并且看起来线的端点消除锯齿。这是其中之一:

Lines without anti-aliased endpoints http://whileyouweregone.co.uk/images/stackoverflow/bad-aa.png

(你可以看到的每一步都是由10条垂直线组成,每条线的x坐标以1.0为增量递增,y坐标以0.1为增量递增。)

有没有办法让OpenGL也能对行的终点进行反混淆?

修改

根据Calvin1602's answer,我尝试删除GL_LINE_SMOOTH内容,而是通过将以下内容添加到我的AGL属性数组来启用MSAA:

AGL_SAMPLE_BUFFERS_ARB, 1, AGL_SAMPLES_ARB, 4, AGL_MULTISAMPLE

......并致电:

glEnable(GL_MULTISAMPLE_ARB);

但是,我仍有同样的问题。线边缘是消除锯齿的(以稍微不同的方式),但端点不是。

*屏幕截图来自运行OS X 10.7.1的Mac Pro和ATI Radeon HD 5770 1024 MB。

编辑2:

使用MSAA对我不起作用,但只是将我的所有线条绘制成非常薄的矩形as suggested by ltjax似乎已经完成了这一操作。 (我不需要使用纹理或渐变。)

3 个答案:

答案 0 :(得分:3)

是的,全屏抗锯齿将为您完成此操作。例如,multi-sampling将起作用并得到广泛支持。如果你想坚持使用消除锯齿的线条,你可以通过绘制四边形(比你的线条略大)来模拟它,并使用预定义的“渐变”纹理或评估距实线的距离的着色器。

答案 1 :(得分:2)

尝试禁用GL_LINE_SMOOTH内容,这些内容在驱动程序中没有明确定义的行为,并使用MSAA(多样本消除锯齿)。

这是在创建上下文时启用的;这取决于你正在使用的框架。 GLFW? SDL?其他?自制?

答案 2 :(得分:0)