3

私はフライトシミュレーターを書いていますが、このジャンルの古典的な問題に悩まされています。視錐台の近くの飛行機は航空機のコックピットが見えるように十分に近くなければならず、遠くの飛行機は最大で見える距離を可能にするために遠くになければなりません40km。

可視距離または近距離/遠距離の比率は、openglのzバッファ精度能力を実際に超えており、遠くのオブジェクトは激しくちらつきます。これは、派手な3Dエンジンが問題を抱えている場所であり、openglの真の知識が必要です:)。おそらく私は問題を解決する正しい方法を見つけました(私が間違っている場合はOpenGLの専門家が私を修正します)が、私の解決策は重要な部分を見逃しています。変更されたレンダラーは、ダブルパスレンダリングを実行します。

  1. 最初のパスでは、遠くのオブジェクトと背景を表示する必要があります。近くの平面を移動し、zバッファは満足のいくもので、地形は見栄えがしますが、近くのオブジェクトは切り取られます。
  2. 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ビットです。

4

2 に答える 2

7

2 つのパスの間に画面をクリアしないでください。深度バッファをクリアしたいだけなら、深度バッファだけをクリアします。に渡さないでGL_COLOR_BUFFER_BITくださいglClear

いずれにせよ、(すべてを再レンダリングする必要がないように) これを行うためのより良い方法は、適切な深度範囲を採用することです。コックピットはシーンと交差できないため、シーンの深度範囲に描画する理由はありません。

そのため、最初に、適切な遠近法マトリックス (つまり、数フィート程度の適度な大きさの z-near を持つもの) を使用して、シーンを描画します。シーンはコックピットで構成されていません。このglDepthRangeレンダリングの は [0.05, 1.0] のようになります。

その後、コックピットだけに適切な遠近法マトリックスを使用して、コックピットを描きます。これのglDepthRangeは [0, 0.05] になります。これにより、シーンとコックピットの両方で十分な深度ビットの精度が得られるはずです。

ああ、24 ビットの深度バッファを取得していることを確認してください。

于 2011-07-31T21:51:17.670 に答える
2

コックピットと外側は、HUD とシーンのように、ステンシル バッファーの典型的なケースです。ステンシルの利点は、z がまったく必要ないため、ニア プレーンをはるかに遠くに設定できることです。また、透けて見えるウィンドウは変化しない (コックピット内で仮想ヘッドを回転させた場合を除く) ため、1 回の描画で何度も再利用できます。

また、対数 zは興味深い読み物かもしれません。

于 2011-08-01T12:41:24.213 に答える