最後に、多くの調査の結果、前に誰かが言ったように、普遍的に「最良の」方法はないと結論付けることができます。しかし、私の調査により、次のような知識が得られました。
最終的に使用するメッシュに応じて:
- Spherified Cube:四分木を実装した LOD メソッドは問題なく機能します。面間の境界などの特殊なケースに注意する必要があります。この場合、四分木は各レベルの隣接面に隣接する面へのポインターを持っている必要があります。
- その他: ROAM (新しいバージョン 2.0 または BDAM、CABTT、RUSTIC などのその他の拡張機能) はうまくいくと思いますが、これらのアルゴリズムは扱いにくく、より多くのメモリを必要とし、キューブを使用する他のアプローチよりも少し遅くなります。
うまく適合する LOD メソッドはたくさんありますが、個人的なトップ 5 は次のとおりです。
- 連続距離依存 LOD (CDLOD)
- GPU ベースのジオメトリ クリップマップ (GPUGCM)
- チャンク LOD
- OpenGL GPU テッセレーションによる地形のレンダリング (書籍: OpenGL Insight、第 10 章)
- 幾何学的ミップマッピング
それぞれが地形をレンダリングする独自の方法を提供します。たとえば、CDLOD はシェーダー (GLSL または HLSL) を使用して非常に簡単に実装できますが、CPU (レガシー ハードウェア用) に実装することもできますが、Planet Rendering の目標は、最新の GPU に最適であるため、GPU を圧迫したい場合は GPUGCM が最適です。どちらも、大規模な地形のデータベース、手続き型、または混合 (固定データまたは高さマップに基づく地形と手続き型作業で追加された詳細) レンダリングで非常にうまく機能します。
また、基本的な Geometryal Clipmaps メソッドへの Spherical 拡張も存在しますが、高さマップの平面サンプルは球面座標を使用してパラメーター化する必要があるため、いくつかの問題があります。
一方、チャンク LOD はレガシー ハードウェアに最適で、GPU 側の計算を実行する必要がなく、大規模なデータセットには最適ですが、手続き型データをリアルタイムで処理することはできません (変更を加えると可能になるかもしれません)。
テッセレーション シェーダーを使用することは、OpenGL 4.x が登場して以来、非常に新しい別の手法です。私の意見では、これが最善の方法である可能性があります。精度について。
精度を頂点間で 1Km にしたい場合を除き、テッセレーション シェーダーを使用してください。この方法での非常に大きな地形の問題は、ジッターを解決するのが難しいことです (少なくとも、私はテッセレーション シェーダーを初めて使用するので)。
Geomipmapping は優れた手法であり、quadtree を利用し、投影ピクセル エラーが低くなりますが、惑星のレンダリングでは、少なくとも 16 レベル以上の詳細を設定する必要があります。つまり、(pourposes をステッチするために) 追加のパッチが必要になります。異なるレベルを接続して隣のレベルを処理するには、特に 6 つの地形面を使用すると、解決するのが面倒になる可能性があります。
独自の非常に特殊な別の方法があります。「惑星地形の射影グリッドマッピング」は視覚化に優れていますが、欠点があります。詳細を知りたい場合は、リンクにアクセスしてください。
問題:
ジッター: 現在の GPU のほとんどは 32 ビットの浮動小数点値のみをサポートしており、惑星規模の地形で大きな位置を操作するには十分な精度が得られません。ビューアーがズームインして回転または移動すると、ジッターが発生し、ポリゴンが前後に跳ね返り始めます。
これに対する最善の解決策は、「GPU を使用した目に対するレンダリング」メソッドを使用することです。この方法は、本「3D Engine Design for Virtual Globes」(インターネットでも見つけることができると確信しています) で説明されており、基本的にはすべての位置を CPU 上の double で設定する必要があります (パッチ、クリップマップ、オブジェクト、視錐台、カメラなど)、次に MV は、変換を (0, 0, 0)T に設定することでビューアーの中心に配置され、double は 2 つの float の小数 (仮数) ビットを使用して固定小数点表現でエンコードされます。そして何らかの方法で高い(Ohlarikの実装の使用とDSFUN90 Fortranライブラリについて読んでください)。
頂点シェーダーでは追加で 2 つの減算と 1 つの加算しか必要ありませんが、GPU RTE では、位置に必要な頂点バッファー メモリの量が 2 倍になります。位置のみが保存されない限り、これは必ずしもメモリ要件を 2 倍にするわけではありません。
深度バッファの精度: Z ファイティング。非常に大きな地形、この場合は惑星をレンダリングしているので、Z バッファは非常に大きくなければなりませんが、znear と zfar に設定する値に関係なく、常に問題が発生します。
Z バッファーは浮動小数点の間隔に依存し、線形であるため (透視投影は非線形ですが)、目の近くの値は、32 ビット浮動小数点数の精度が不足しているため、Z ファイティングの影響を受けます。
この問題を解決する最善の方法は、「対数深度バッファ」を使用すること
です http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html
対数デプス バッファーは、zscreen の対数分布を使用することで、遠くのオブジェクトのデプス バッファーの精度を向上させます。近くのオブジェクトの精度と、遠くのオブジェクトの精度を交換します。LOD 方式でレンダリングしているため、遠方のオブジェクトは三角形が少ないため、必要な精度が低くなります。
言及する重要なことは、リストされているすべてのメソッド (射影グリッドを除く) は、ゲームを作成する場合に必須のクアッドツリー ベースのため、物理 (主に衝突) を行うときに非常に優れているということです。
結論として、利用可能なすべてのオプションをチェックして、より快適に感じるオプションを選択してください。私の意見では、CDLOD は素晴らしい仕事をします。ジッタと Z バッファの問題を解決することを忘れないでください。そして最も重要なことは、作成を楽しんでください!
LOD の詳細については、このリンクを確認してください。
立方体の球体化に関する完全なデモンストレーションについては、このリンクを確認してください。
ジッタリングと Z バッファーの精度の解決に関するより良い説明については、この本を確認してください。
この小さなレビューがお役に立てば幸いです。