我在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似乎已经完成了这一操作。 (我不需要使用纹理或渐变。)
答案 0 :(得分:3)
是的,全屏抗锯齿将为您完成此操作。例如,multi-sampling将起作用并得到广泛支持。如果你想坚持使用消除锯齿的线条,你可以通过绘制四边形(比你的线条略大)来模拟它,并使用预定义的“渐变”纹理或评估距实线的距离的着色器。
答案 1 :(得分:2)
尝试禁用GL_LINE_SMOOTH
内容,这些内容在驱动程序中没有明确定义的行为,并使用MSAA(多样本消除锯齿)。
这是在创建上下文时启用的;这取决于你正在使用的框架。 GLFW? SDL?其他?自制?
答案 2 :(得分:0)