私はフライトシミュレーターを書いていますが、このジャンルの古典的な問題に悩まされています。視錐台の近くの飛行機は航空機のコックピットが見えるように十分に近くなければならず、遠くの飛行機は最大で見える距離を可能にするために遠くになければなりません40km。
可視距離または近距離/遠距離の比率は、openglのzバッファ精度能力を実際に超えており、遠くのオブジェクトは激しくちらつきます。これは、派手な3Dエンジンが問題を抱えている場所であり、openglの真の知識が必要です:)。おそらく私は問題を解決する正しい方法を見つけました(私が間違っている場合はOpenGLの専門家が私を修正します)が、私の解決策は重要な部分を見逃しています。変更されたレンダラーは、ダブルパスレンダリングを実行します。
- 最初のパスでは、遠くのオブジェクトと背景を表示する必要があります。近くの平面を移動し、zバッファは満足のいくもので、地形は見栄えがしますが、近くのオブジェクトは切り取られます。
- 2番目のパスでは、投影マトリックスが近距離オブジェクト用に調整され、コックピットが表示されます。
未解決の問題: 2番目のパスでは、すべての離れたオブジェクトと背景が表示されないため、コックピットと黒い背景が背後にあります。2回目のパスの結果は、1回目のパスの結果を完全に無駄にします。エルゴ計画オーバーレイは発生しません。質問:2回目のパスでopenglに背景色を無視させて、両方のパスの結果が目的のオーバーレイを作成するようにするにはどうすればよいですか?
PSこれは現状の画像です(近距離/遠距離の平面はすべての詳細を表示するために極端にあり、投影調整なしのシングルパスです)。
http://www.flickr.com/photos/43342833@N04/5995604542/sizes/l/in/photostream/
バッファのクリアは、レンダリングサイクルごとに1回だけ発生し、2つのパスの間に関与しません。ここにクリアリングコードがあります:
JoglContext jctx = (JoglContext) ctx;
GLContext context = context(ctx);
GL gl = context.getGL();
// Mask of which buffers to clear, this always includes color & depth
int clearMask = GL.GL_DEPTH_BUFFER_BIT | GL.GL_COLOR_BUFFER_BIT;
gl.glPushAttrib(GL.GL_DEPTH_BUFFER_BIT);
gl.glDepthMask(true);
gl.glClearColor(r, g, b, jctx.getAlphaClearValue());
gl.glClear(clearMask);
gl.glPopAttrib();
あなたが説明するアプローチは、2つのパスでも使用されます:1。「長距離」の投影と地形2.「短距離」とコックピットの間はクリアされませんが、2回目のパスの後、コックピットの後ろの背景は黒になります。たぶんglDepthRange関数が役立つでしょう、マニュアルをチェックする必要があります。
zbufferの深さは24ビットです。