利点を失うことなくジオメトリ/メッシュをマージする


11

three.jsでは、ジオメトリをマージして、描画呼び出しの量を制限し、パフォーマンスを向上させることができます。1つのマテリアルを使用した簡単なテストで、GTX660 GPUに50.000のキューブ+ 60fpsのシャドウを描画できました。ジオメトリのマージがなければ、5,000の立方体がすでに問題を引き起こしています。

各キューブメッシュを独自にレンダリングする利点をどのように維持するのかと思います。たとえば、すべてが1つのジオメトリにマージされたときにキューブメッシュを選択するにはどうすればよいですか?もちろんそれはデフォルトでは不可能です。

この問題の一般的なテクニックはありますか?結局、マージした後でも、マージされていないメッシュオブジェクトはすべてあります。それで、それらをピッキングに利用するいくつかの方法があるに違いありませんか?

一言で言いたいこと

  • 学習目的のゲームのようなSimCity
  • 各家は立方体メッシュです
  • 50.000家をレンダリングし、家を追加および削除できるようにしたい
  • マウスカーソル(ピッキング)による家の選択が可能でなければならない

これがあなたに役立つかどうかはわかりませんが、完全を期すために触れておきます。Simplygonは、インディーデベロッパー向けのロイヤルティベースの価格モデルを備えており、設計時にこのメッシュのマージとパーティション分割の多くを実行できます。
steeveeet 16

回答:


11

はい、分かりました。ジオメトリ全体をマージした後も、個々のメッシュが配列に残っています。そのため、レンダリングされていなくても、レイキャスティングにこれらのメッシュを使用できます。これを実現するのにしばらくかかりました。

ここに画像の説明を入力してください

ピッキングには、このoctree実装を使用します。http//threejs.org/examples/#webgl_octree_raycasting

これにより、更新ごとの交差テストが50.000から〜500に下がります。octreeがないと、fpsは大幅に減少します。

オレンジのピッキングハルは、実際にはレンダリングされたメッシュ(+1の描画呼び出し)であり、マテリアルとサイズが変更されています。

ここに画像の説明を入力してください

したがって、次のステップは、ある種のマップ分割を実装することだと思います。つまり、マージされたジオメトリをいくつかの部分に分割します。これは、マージされたジオメトリに大量の頂点があるためです。つまり、マップを画面から99%移動すると、ジオメトリが少なくとも1%表示されているため、グラフィックスカードはすべての頂点を処理する必要があります。したがって、分割されている場合は、表示されている部分のみをレンダリングする必要があります。


この洞察をありがとうございました。私もこれを行う方法を見つけようとしてきました、そしてここであなたの解決策が最も優れていると思います!簡単な質問ですが、オブジェクトのローカルリスト(つまり、Three.Object3D)の場合、rayCaster.intersectObjects()が機能するにはどのような種類のプロパティが必要ですか。
AlvinfromDiaspar 2014

とてもよくできました。
ClassicThunder 2014

同様の問題がありますが、どういうわけかr70でレイキャスティングを実行できません。ボックスの作成とマージ中に何か特別なことをしましたか?次のコード(pastebin.com/PStaAF3P)を使用してノードを作成およびマージしますが、raycasterを機能させるために何か不足している可能性がありますか?
fhahn 2015年

簡単な質問:私はあなたに非常によく似たことをしています(geoJSONデータに基づく3Dマップ)。この方法では、カメラを回転させるたびに、既存の建物メッシュも回転させる必要がありますか?または、個々のボックスをシーンに追加するだけでレンダリングしませんか?
スペンサー

@Spencerいいえ、回転する必要はありません。個々のボックスをグローバル配列に保持し、マージされたジオメトリのみをシーンに追加します。その後、レイキャスターはカメラマトリックスと各ボックスの位置に依存するため、グローバル配列のオブジェクトでレイキャスティングを実行できます。おそらく最善の方法ではありませんが、これは私にとって概念の証明にすぎませんでした。この時点で、three.jsを実行しなくなりました。
user990827

1

ピッキングのために、各キューブのIDを別のレンダーターゲットにレンダーし、カーソルのID値を確認することもできます。利点は、ピッキングがピクセル完全であり、より複雑なジオメトリに対しても効率的に機能することです。

すべてのオブジェクトが同じジオメトリを持つ場合、インスタンス化されたレンダリングを使用できます。1つのストリームはジオメトリを定義し、もう1つのストリームはインスタンスごとのプロパティを定義します(変換など)。錐台カリングでは、可視性テストに基づいて各フレームのインスタンスストリームを構築する必要があります。大量のオブジェクトがある場合は、それらのオブジェクトをルーズオクツリーなどに配置して、カリングを高速化することができます。


0

three.jsの詳細についてはよくわかりませんが、一般的なOpenGLで考えられる2つのパフォーマンスの問題が頭に浮かびます。

  1. インスタンス化を検討しましたか?描画呼び出しも1つだけ必要で、VRAMの使用量も少なくて済みます。
  2. ピッキングアルゴリズムを真剣に検討しましたか?たとえば、キュ​​ーブの境界ボリュームがツリーではなくリストにある場合、その大きさの違いが説明されます。

0

あなたが取ることができる別のアプローチは、ジオメトリにいくつかの頂点属性を構築し、ハイライトロジックをフラグメントシェーダーに入れることです。これは、メモリにデータの2つのコピーを残したくない場合に非常に役立ち、ハイライトの実装方法をより詳細に制御できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.