2012-01-12 6 views
1

私のJavaアプリケーションは、joglを使ってオーバーレイされたグリッドを持つサーフェスを作成します。グリッドの線はアンチエイリアス処理されています。しかし、Windows上では、小さなアルファ値をサーフェスに追加しない限り、アンチエイリアスは完全なゴミです。Windows 7でjoglを使用したアンチエイリアス処理された線はひどく見えます

のMac OS X:

Mac OSX

Ubuntuの11.10:

Ubuntu 11.10

のWindows 7:ここでは3つのすべてのプラットフォームで同じシーンのスクリーンショットがある

Windows

アルファとの

のWindows 7 = 0.01:

Windows with (small) 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オフセット試してみましたを使用して作成されます。

ハードウェアに関しては、nVidia 3100MカードとIntel Core 2 Duo iMac(ATI Radeon内蔵)を搭載したデュアルブートIBM ThinkPad(64ビットクアッドコア)を使用しています。 UbuntuとWindowsは同じハードウェア上で動作しているので、ハードウェアの問題ではないことはわかっています。

Windowsのグリッド線のアンチエイリアスを改善するための提案を探しています。

+0

表面を少し上に描こうとしましたか?私はあなたが 'gl.glDepthFunc(GL.GL_LEQUAL)'に切り替わったことに気が付きましたが、FP丸めのためにzバッファリングの問題がある可能性があります。 –

+0

また、あなたがリンクしているOpenGLのドキュメントでは、クリップをクリップしたい場合でも、ラインを描いている間に深さバッファに**書き込み**を無効にすることを提案しています( 'glDepthMask_FALSE(GL_FALSE)')。 –

+0

@RussellZahniser:私はそれを達成するためにGL_POLYGON_OFFSET_FILLを使用しています。 – javagrendel

答えて

1

私は試していませんでした(私は持っていたと思ったが、再構築して正しくテストしなかった) gl.glDepthMask(false);

これを正しく追加すると、グリッドのアンチエイリアス処理された行の断片化が大幅に改善されました。

しかし、私はまだ線の外観に100%満足していませんが、今のところこの問題は解決されています。ここでは「改善された」グリッド線のスクリーンショットである:これは大きな改善ですが

enter image description here

、それはまだMac OS XまたはさえUbuntuのほど良くはありません。