ボクセルキューブランドスケープ用のメッシュの最適化


12

Unity 3DでMinecraftish / LEGOワールドランドスケープ(キューブでプロシージャルに生成されたボクセルランドスケープ)を作成してみて、これらのランドスケープ用に作成されたメッシュが大量のメモリを消費することがわかりました。メッシュは現在、立方体の可視側面の頂点のみで構成されています。複雑な地形のメモリ使用量は、600〜700メガグラムかかる場合があります。

これらのメッシュは最適化できますが、これを行うための適切なアルゴリズムを見つけるのに苦労しています。

アルゴリズムは、異なる地形タイプのブロックを「マージ」したくないことを考慮に入れる必要があります。本当に簡単なスタートは、1つの軸に沿ってすべてのブロックを処理し、他の2つの軸に対して余分なスイープを行うことだと思います。

メッシュの形状を維持する必要があります。これは、空の空間または固体の空間が変更されるポイントへの頂点のマージではありません。その理由は、メッシュの周りをナビゲートする必要がある生き物などがあるかもしれないからです。そのため、非常に詳細度の低い、歪んだメッシュを作成することはできません。

これについての考え/提案/ヒントはありますか?


2
既知のサイズのキューブの頂点を保存するのはなぜですか?アルゴリズム的に実行します。または共有頂点バッファーを使用します。
減速

なぜポリゴンメッシュなのか?ボクセルは、まさにそのように非常に効率的にレンダリングできます。1つのボクセルキューブには、3つのフロート(x、y、z)が必要です。1つのボックスには、約8 * 3のフロート(8つの頂点)が必要です。たぶん、Unityはこのボクセル問題のツールではありません。
user712092

回答:


5

私の質問は:

なぜ生き物を動かすのにメッシュ自体が必要なのですか?

idの3Dマトリックスでパス計算を行うことはできませんか?

Minecraftは4ビットprブロックの3Dマトリックスを使用していると思います。また、プレイヤーの周囲の特定の半径のクリーチャーのみをシミュレートします。

各チャンクが圧縮されるocツリー構造にチャンクを保存できます。

圧縮されたデータをRAMに保存すると、必要なときにデータを非常に迅速に解凍できます。

代替テキスト


Unityで組み込みの衝突検出用のメッシュを使用することに依存していましたが、カスタムデータ構造に対する衝突/パスをテストすることを止めるものは何もありません。ただし、地形を表示するための可視メッシュを作成する必要があり、これが最適化する必要があるものです。
ジェームズリビングストン

もう1つのポイント...スクリーンショットでわかるように...この地形の平坦な部分はそれほど多くありません。メッシュは通常、立方体の粗い表面ですが、メッシュの面/頂点を最適化する余地があると思います。八分木は、「ジャギー」データではなく、データの類似したブロックを多く持つデータに最適だと思われます。または、これは正しくありませんか?
ジェームズリビングストン

@Gatorfrog:空きスペースもデータであることを忘れないでください。ジャギーの場合は、空であることを示すビットがたくさんあります。octreeは、レンダリングする前に圧縮解除する必要があるチャンクを把握するためにあります。空のスペースは単なるゼロの集まりです。私の日課では、非常に洗練されたボクセルレンダリングライブラリを使用します。次の投稿では、彼らが何をするかを説明します。
ネイラー

私が使用しているライブラリは次のことを行います。データのチャンクを作成し、フラットファイルデータベースに保存します。各チャンクにはIDがあります。各キューブは多くのチャンクで構成されています。各チャンクに対して、一定数の詳細レベルが作成されます。最高レベルの詳細には100%のボクセルがあり、2番目に高いレベルにはすべてのボクセルの25%があり、その後の各レベルですべて4で除算されます。あなたに近いチャンクは、最高レベルの詳細を使用して視覚化できます。
ネイラー

すべてのデータは、RAMからVRAMに圧縮された状態で出荷され、CUDAで実行されているGPGPU圧縮アルゴリズムによって膨張されます。これにより、メモリ帯域幅を大幅に節約できます。だから:プレイヤーがいる場所をチェックして、そこに高レベルのディテールチャンクを取得すると、下位のLODの1つを使用して、最も遠いものを簡単に視覚化できます。
ネイラー

1

octreeを使用して地形を保存するのはどうですか?

たとえば、空気=ノードなし、他のすべての地形タイプには地形タイプのノードがあります。

ノードを挿入/削除するとき、変更されたツリーパス上の各ノードの8つの子すべてが同じ地形タイプを持っているかどうかを確認し、必要に応じてそれらをマージできます。そうすれば、同じマテリアルの大きなブロックは1つのノードしか占有しません。


0

プレイヤーが見ることができるジオメトリの一部のキューブのみを作成していますか?それが私の最初のステップです。地形のサイズに応じて、世界全体をロード/描画/表示/表示する必要はありません。


空の空気が隣にあるキューブの側面のメッシュのみを作成しています。プレイヤーが見ることができないメッシュを描画しない限り...地下の洞窟や斜めに地面に通じる穴など、目に見えるブロックのないチャンクを除外することを考えました。ただし、その時点では、メッシュに依存してコリジョン/パスを行うことは絶対にできません。
ジェームズリビングストン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.