2

何千もの立方体で構成される 3D 地形 (Minecraft など) で、位置とレンダリングに関して各ブロックを処理する方法は何ですか? より具体的には、キューブのプリミティブを描画し、それを directX 9 のあらゆる場所で変換する世界は、パフォーマンスの問題が非常に多いため、これを達成するためのおそらくばかげた方法であることを知っています。

各立方体は何度もコピーされるメッシュであるべきですか、それとも頂点バッファー内のデータから適切なメッシュを作成する方法ですか?

実装したいものを実装するための背後にある理論の一部を説明しているこの記事を見つけましたが、これまで octrees を使用したことがないため、ソース コードから多くを引き出すことができませんでした。八分木が実際に進むべき道である場合、それらについて学ぶための良い出発点はどこですか? 私のグーグル検索のほとんどは、実装例がほとんどまたはまったくない理論に関するブログ投稿しか見つかりませんでした。

これを行うにはボクセルを使用すると便利なようですが、オクトリーと同様に、私はここでの経験がないので、最初に何を勉強すればよいかよくわかりません。

とにかく、あなたが惜しまないアドバイス\リソース\本の名前に感謝します。当たり前のことだと思いますが、私はまだ 3D プログラミングに非常に慣れていないので、助けていただければ幸いです。

4

3 に答える 3

2

まず、Minecraft を参照として使用している場合は、チャンクの使用法を考え、それを Oct-trees に関連付けます。Minecraft は、格納する必要がある大量の情報を処理するために、世界をより小さなチャンクに分割します。そのため、格納されるこのデータを整理するために Oct-trees を使用します。Goz は Oct-tree と Quad-tree がどのように機能するかについて非常に正確に説明しているので、彼の情報を参考にしてください。

考慮すべきもう 1 つのことは、実際にはすべての立方体を画面に描画したくないということです。これはフレームレートを食い尽くすからです。オブジェクト カリングを使用して、目に見える立方体のみを画面に描画します。繰り返しますが、マインクラフトだと思います。ブロックや世界の下が見える不具合に遭遇したことはありますか? これは、Minecraft がブロックの最上層のみを描画するためです。このように多くのオブジェクトが画面に表示されているため、カメラ錐台とオクルージョン クエリの両方を使用してオブジェクト カリングを調べることは、投資する価値があります。

DirectX の使用に関する情報については、Frank Luna の本をお勧めします。私はこの本を自分で所有しており、DirectX でプログラミングするときは、私のそばから離れることはありません。 http://www.amazon.com/Introduction-Game-Programming-Direct-9-0c/dp/1598220160/ref=sr_1_3?ie=UTF8&qid=1332478780&sr=8-3 ほとんど学んだので、この本を強くお勧めしますそこから DirectX について知っていることはすべて。

Luna はオクルージョン カリングを扱っておらず、フラスタム カリングのみを扱っているため、Google 検索で、オクルージョン カリングについて説明しているこのリンクを見つけました。Programming Gems シリーズについてはよく言及されていると聞きますが、その名前を個人的に証明することはできません。 http://http.developer.nvidia.com/GPUGems/gpugems_ch29.html

お役に立てれば。

于 2012-03-23T05:18:16.303 に答える
1

オクトツリーはかなり単純で、特にマイン クラフトのような軸に沿ったものです。

これは基本的に、四分木を 3D に拡張したものにすぎません。最初に四分木について学ぶ方が簡単かもしれません。

四分木の概要を簡単に説明します。基本的に、正方形から始めます。次に、その正方形にもっと小さい正方形を配置することを想像してください。それを表す四分木を構築したい場合は、最初に元の正方形を 4 つの等しいサイズの正方形に分割します。

次に、各象限を確認し、小さい正方形がその象限にある場合は、その象限を 4 つの小さいサイズの正方形に分割します。次に、それらの 4 つの象限を確認して、象限を選択し、細分化します。最終的に、小さな正方形は、象限内の象限内の 1 つまたは複数の象限 (など) に完全に含まれます。これでクワッド ツリーが作成されました。

ここで、大きな正方形内の特定の正方形を検索していると想像すると、四分木のボーナスがすぐにわかります。クアッド ツリー内の可能なすべての正方形を検索する (テクスチャ内のすべてのピクセルを検索するのと同じ) 代わりに、最初の 4 つの象限をチェックして、それが含まれているかどうかを確認できるようになりました。ある場合は、正方形 (またはピクセル) を完全に含む最小の象限が見つかるまで、その 4 つのサブ象限などを確認できます。このようにして、オブジェクトを見つけるためのテストを大幅に減らすことができます。

オクトツリーは基本的に同じものですが、正方形を正方形でエンコードする代わりに、キューブをキューブでエンコードします。すべての立方体は、8 つの小さなオクタントに分割できます (したがって、oct-tree という名前が付けられています)。

オクトツリーには、どのオクタントから開始するかを知ることで、オクトツリーを介してレイを簡単にキャストして衝突を見つけることができるという利点があります (オクタントが満杯、部分的に満杯、または空であるため)。オクタントが空の場合は、それを通り抜けてから、反対側のオクタントを確認します。部分的に埋まっている場合は、完全なオクタントを見つける (つまり、ソリッド キューブにヒットしてレンダリングする) か、オクタントを完全に通過してレンダリングするキューブがなくなるまで、そのサブオクタントなどをチェックします。 . これがMinecraftの仕組みです(とにかく推測しています;))。これは、ボクセル データをすばやくレンダリングするための優れた方法でもあります。将来のレンダリング メカニズムの可能性として、最近多くの人が検討しています。

それが助けになることを願っています!:)

于 2012-03-22T18:37:30.350 に答える
0

Oct-trees と quad-trees は、レンダリングするジオメトリのセクションをカリングするのに役立ちます。Minecraft は 16x16x16 のレンダリング ブロックを使用して、地形を扱いやすい部分に分割します。

考慮すべきもう 1 つの手法は、インスタンス化です。インスタンス化は、異なる場所でオブジェクトを複数回レンダリングするように GPU に指示する場所です。群衆のレンダリング、木、ジオメトリが同じであるが、それらがたくさんあるものすべてに使用されます。

http://msdn.microsoft.com/en-us/library/windows/desktop/bb173349(v=vs.85).aspx

http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter03.html

これは、ライターが OpenGL 4 で Minecraft レンダラーを複製する記事です。コードはあなたのケースには適用されませんが、テクニック (囲まれた立方体をカリングするなど) は directx レンダラーに適用できます。

http://codeflow.org/entries/2010/dec/09/minecraft-like-rendering-experiments-in-opengl-4/

ブロック状のグラフィックと低品質のテクスチャに惑わされないでください。Minecraft は非常に複雑なレンダラーであり、関連する膨大な数のアイテムを処理する方法を考え出す必要があります。たとえば、世界の「小さな」部分でさえ、100x100x100 ブロックが 100 万ブロックであるとします。各ブロックを個別のメッシュとして GPU にプッシュすると、GPU が停止します。Minecraft のレンダラーは、テクノロジーに取り掛かると、ほとんどのファースト パーソン シューティング ゲームよりもはるかに複雑です。

于 2012-09-01T16:17:58.413 に答える