1

3D オブジェクト (obj または 3ds または collada ファイル) を openGL アプリケーションにロードしています。3 環境は非常に大きい (すべての軸で数百メートル)。私の問題は、より小さい 3D オブジェクト (つまり ~< 1-2m のオーダー) が適切に深度テストされていないように見えることです。カメラのズームによっては、オブジェクトの背面 (テスト用に単純な立方体を使用しています) や、他の面が見える/見えない/破れているのが見えることがあります。より良い説明については、添付の画像を参照してください。この問題は、ミップマッピングが有効になっていることが原因であると思われます。ミップマッピングを無効にするか (誰かがこれを行うための簡単で迅速な方法を提案できますか)、ミップマッピングされたオブジェクトの解像度を高く設定したいと思います。それとも、間違ったツリーを完全に吠えていますか?

代替テキスト 代替テキスト 代替テキスト

ありがとう

クリス

4

2 に答える 2

11

これは、Z バッファーの精度が不十分な結果であり、巨大な世界を (比較的) 小さいオブジェクトを持つゲームで問題となります。当面の解決策は、16 ビットの代わりに 24 ビットの z-buffer を使用することです。これに取り組むもう 1 つの方法は、ゲームの世界を 2 段階でレンダリングすることです。最初に遠くの大きなオブジェクトをレンダリングし、次に zbuffer をクリアしてから近くのオブジェクトを描画します。

ちなみに、この特定の問題は z-fighting と呼ばれます。この問題に関する優れたリソースは次のとおりです: http://www.codermind.com/articles/Depth-buffer-tutorial.html

要点は、上記の記事の最後の段落です。

真の問題は、非常に遠いオブジェクトと非常に近いオブジェクトの両方を同じ深度バッファー式で描画できないことです。非常に遠くのオブジェクトを描画する場合は、近くのビューをさらに押し込んで犠牲にする必要があります。クリッピング アーティファクトを回避するには、コリジョン エンベロープを十分に大きくして、クリッピング プレーンが錐台内の既存のオブジェクトをインターセプトしないようにします。または、オブジェクトがクリップ プレーンに近づくにつれて、オブジェクトを透明にして徐々に非表示にすることもできます。

オブジェクトを近くに置き、同時に遠くに山 (または惑星) を描きたい場合は、レンダリングを部分的にカットできます。最初に far オブジェクトを描画し、次に深度バッファーをクリアして、near オブジェクトを別の z バッファーでレンダリングします。

于 2010-12-17T09:33:51.920 に答える
2

Julio のように、これは深さの精度の問題であり、ミップマッピングに関連するものではないと考えています。ただし、他のものを変更する前に、ニア クリッピング プレーンとファー クリッピング プレーンを調整することから始めることをお勧めします (ほとんどのドライバー/カードのデフォルトであるため、おそらく既に 24 ビットの深度バッファーを使用しているはずです)。特にニア プレーンは、シーンに対してできるだけ遠くに配置する必要があります。glFrustumまたはへの呼び出しを探しますgluPerspective

于 2010-12-17T09:39:24.220 に答える