スパースオクロースのための効率的な保管?
-
09-09-2020 - |
質問
誰もが 速い 、スパースオクロイスの保存とアクセスのための効率的な方法を提案することができますか?
好ましくは、HLSLで容易に実装できるもの。(私はRaycasting / Voxel Appを作業しています)
この場合、ツリーは事前計算できますので、ほとんどのサイズと検索時間に関係しています。
更新
これをやろうとする人のために、より効率的な解決策は、Zオーダー曲線/モートンツリーで生成された線形八塩としてノードを保存することであり得る。そうすることで、内側ノードの保存を排除しますが、個々のボクセルに関する情報を含むリニアツリーアレイを2番目の「データテクスチャ」と相互参照を必要とします。
解決
私はHLSLであまり経験していませんので、これがあなたのニーズを満たすのかわからない、ここに私の考えがあります。ここで何かがあなたのニーズにわたってサインされていないかどうかを私に知らせてください - 私は議論したいのですが、私は自分自身を学ぶことができます。
- octree内のすべてのノードはベクトル3として存在することができ、ここで(x、y、z)成分はノードの中心点を表します。 wコンポーネントはフラグフィールドとして使用できます。 a。 Wフラグフィールドは、どのOctant子ノードを現在のノードに従うかを示すことができます。これには8ビットの値が必要になります。
- octreeに格納されている各エンティティは、境界ボックスとして保存できます。ここで、R、G、Bは境界ボックスの寸法になることができ、Wは何でも使用できます。
- オブジェクトリストが続くことを示す特別なベクトルを定義します。たとえば、(w + z)がマジック値の場合いくつかのfunc(x、y)は、言うことができます、それに続くオブジェクトの数になります。または、何でも。 a。各ノードはこの特別なベクトルが続く潜在的に次の特別なベクトルが続き、ノードに格納されているオブジェクトがあることを示します。次のXベクトルはすべてオブジェクト識別子またはそのようなものです。 b。あるいは、インメモリオブジェクトリストを指定するだけのノードを1つ持つことができます。繰り返しますが、ここで必要なものやオブジェクトにアクセスする方法に関する制約がわかりません。
だから、まず八店を構築し、それをあなたのオブジェクトで詰め込む。次に、ただオクチートを歩き、ベクトルをメモリバッファに出力します。
512 x 512テクスチャは、それぞれ8個のオブジェクトを含む完全充電された八料16(32,768ノード)を保持できると考えています。または、それぞれ64個のオブジェクトを持つ完全梱包された4レベルの八穴。
他のヒント
GPUに焦点を当てたスパースオクトレについての素晴らしい記事があります:効率的なスパースボクセルOctrees - 分析、拡張、および実装
所属していません StackOverflow