6

最近ボクセルエンジンの開発を始めました。私が必要とするのは、テクスチャのないカラフルなボクセルだけですが、非常に大量 (Minecraft よりもはるかに小さい) です。問題は、シーンを非常に高速に描画する方法です。私はc#/xnaを使用していますが、これは私の意見ではあまり重要ではありません。一般的なケースについて話しましょう。次の 2 つのゲームを見てください。

  1. http://www.youtube.com/watch?v=EKdRri5jSMs
  2. http://www.youtube.com/watch?v=in0bavLJ8KQ

特にビデオ番号 2 は優れた最適化方法を表していると思います (私の gfx カードは 192 x 192 x 64 で窒息し始めます) どうやってこれを達成するのですか?

私がエンジンに持っているもの:

  • テクスチャのないカラフルなボクセル
    • 多くの、多くのボクセル、ビデオ #2 のようなものを達成するために最小 512 x 512 x 128 と言う
    • 影 (滑らかな影は素晴らしいですが、これは必須ではありません)
    • オプション: 動的照明 (たとえば、ボクセル構造の近くで光る火の玉が飛んでいる場合)
    • フレームレート 最低 40 FPS
    • カメラには 3 つの自由度 (x 軸で移動、y 軸で移動、z 軸で移動) があり、カメラの回転は必要ありません。
    • 最後に、オプション機能は被写界深度かもしれません (それは甘いでしょう ^^ )

私がすでに知っている最適化:

  • ボクセル構造内に存在する目に見えないボクセルを削除します (他のボクセルによって 6 方向が覆われています)。
    • ボクセルの見えない面を削除 - カメラには回転がなく、TPP ゲームのように常に斜め前を向いているため、画面を垂直カットで分割すると、左のボクセルと右のボクセルに 3 つの面しか表示されません
    • ボクセルを 3 次元配列ではなく Dictionary に保持します - サイズ 512 x 512 x 128 の配列をジャンプするには許容できないミリ秒かかります - しかし、int がパックされた 3D 位置を記述する辞書 int:color ははるかに高速です
    • 該当する場合はインスタンス化を使用する
    • 閉塞?(これを行う方法?)
    • 空間分割 / octtree (それは良い考えですか?)

誰かが上記の既存の最適化を改善する方法を教えてくれたり、新しい改善のアイデアを共有したりできれば、とても感謝しています。ありがとう

4

2 に答える 2

8

1) Voxatron は、GPU ではなくソフトウェア レンダラーを使用します。このブログ投稿のコメントを読むと、詳細を読むことができます。

http://www.lexaloffle.com/bbs/?tid=201

詳しく調べていないので、これ以上のことは言えません。

2) 私は 3D ドット ゲーム ヒーローズをプレイしたことがありませんが、ボクセルを使用していると信じる理由はまったくありません。つまり、キューブが追加または削除されているのがわかりません。ほとんどの場合、適切なテクスチャが適用された単なる静的ポリゴン メッシュです。

自分で実装する場合は、キューブをレンダリングして世界を描画しようとしないでください。これは非常に遅いためです。代わりに、ボリュームを処理し、ソリッド ボクセルと空のボクセルの交点にあるメッシュを生成する必要があります。ボリュームを適切なサイズの領域 (32x32x32 など) に分割し、それぞれのメッシュを生成します。

これについては、役に立つと思われる本の記事を書きました。これは実際には滑らかなボクセル地形に関するものですが、多くの原則が適用されます。

Google ブックスで読むことができます: http://books.google.com/books?id=WNfD2u8nIlIC&lpg=PR1&dq=game%20engine%20gems&pg=PA39#v=onepage&q&f=false

関連するソース コードは、http ://www.thermite3d.org にあります。

于 2011-10-12T20:09:14.037 に答える
2

XNA を使用しているため、インスタンス化を使用して目的の効果を得ることができます: http://www.float4x4.net/index.php/2010/06/hardware-instancing-in-xna/ http://roecode.wordpress .com/2008/03/17/xna-framework-gameengine-development-part-19-hardware-instancing-pc-only/

DrawIndexedPrimitive基礎となる概念はインスタンス化です。この機能を使用すると、1 回の呼び出しで一定量の繰り返しデータと一定量の変動データを指定できます。あなたの場合、インスタンス ストリームは 1 つの実線のボックスになり、他のストリームは変換と色の情報になります。

于 2011-10-12T20:39:55.430 に答える