【发布时间】:2012-01-12 21:53:07
【问题描述】:
我的 java 应用程序使用 jogl 创建带有重叠网格的表面。网格线是抗锯齿的。但是,在 Windows 上,抗锯齿完全是垃圾,除非我在表面上添加一个小的 alpha 值。以下是三个平台上同一场景的屏幕截图:
Mac OS X:
Ubuntu 11.10:
Windows 7:
带有 alpha=0.01 的 Windows 7:
创建它的基本过程如下:
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 上网格线抗锯齿的建议。
【问题讨论】:
-
您是否尝试过在表面稍上方绘制线条?我注意到您切换到
gl.glDepthFunc(GL.GL_LEQUAL),但由于 FP 舍入,您仍然可能遇到 z 缓冲问题。 -
此外,您链接到的 OpenGL 文档建议在绘制线条时禁用 写入 到深度缓冲区,即使您仍想使用它来剪辑它们 (
glDepthMask_FALSE(GL_FALSE))。 -
@RussellZahniser:我正在使用 GL_POLYGON_OFFSET_FILL 来实现这一点。
-
@RussellZahniser 是的,我尝试设置 gl.glDepthMask( false ) - 没有任何区别。
-
Java 口号:一次编写,到处调试。
标签: windows opengl jogl antialiasing