我的java应用程序使用jogl创建具有重叠网格的表面。网格线是消除锯齿的。但是,在Windows上,消除锯齿是完全垃圾,除非我向表面添加一个小的alpha值。以下是所有三个平台上同一场景的屏幕截图:
Mac OS X:
Ubuntu 11.10:
Windows 7:
Windows 7,alpha = 0.01:
创建它的基本过程如下:
gl.glPushAttrib( GL.GL_ALL_ATTRIB_BITS );
gl.glEnable(GL.GL_POLYGON_OFFSET_FILL);
gl.glPolygonOffset(1.0f, 1.0f);
drawSurface(gl);
gl.glDisable(GL.GL_POLYGON_OFFSET_FILL);
gl.glPopAttrib();
gl.glDisable( GL.GL_LIGHTING );
gl.glDepthFunc(GL.GL_LEQUAL);
float[] c = {0, 0, 0, 0.5f};
gl.glColor4fv(c, 0);//the alpha here gets overridden if one is specified for the surface (which is why the Windows-with-alpha produces a darker grid)
drawGrid(gl);
gl.glDepthFunc(GL.GL_LESS);
gl.glEnable( GL.GL_LIGHTING );
在为曲面创建多边形之前,drawSurface()方法还会执行以下操作(使用GL_TRIANGLE_STRIP基元):
gl.glPushAttrib(GL.GL_LIGHTING_BIT);
gl.glColorMaterial(GL.GL_FRONT_AND_BACK, GL.GL_AMBIENT_AND_DIFFUSE);
gl.glEnable(GL.GL_COLOR_MATERIAL);
drawGrid()方法设置反锯齿,如下所示:
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL.GL_LINE_SMOOTH);
gl.glHint(GL.GL_LINE_SMOOTH_HINT, GL.GL_NICEST);
网格本身是使用GL_LINE_STRIPs
创建的我已阅读OpenGL documentation regarding line anti-aliasing并尝试了多边形偏移示例here。
至于硬件,我有双启动IBM ThinkPad(64位四核),带有集成的nVidia 3100M卡和带有ATI Radeon的Intel Core 2 Duo iMac。由于Ubuntu和Windows在同一硬件上运行,我知道它不是硬件问题。
我正在寻找改善Windows网格线抗锯齿的建议。
答案 0 :(得分:1)
原来我没试过(我以为我有,但我没有重建并正确测试) gl.glDepthMask(false);
正确地添加它确实极大地改善了网格消除锯齿线的碎片化。
那就是说,我对这些线条的外观仍然不是100%满意,但是,现在,这个问题已经解决了。以下是“改进的”网格线的屏幕截图:
虽然这是一个很大的改进,但它仍然不如Mac OS X甚至Ubuntu好。