私のエンジンでは、CPUで計算されたPerlinノイズalghoritmを使用して無限地形を作成します。
地形の作成は次のようになります。
- カメラがアンロードされたパッチに近い場合、作成します
- 与えられた境界で513x513ノイズ配列を計算します
- 法線、接線、従法線、インデックスを計算する
- データをvboに渡す
長所:
- 必要なときにのみレンダリングする必要がある
- 衝突しやすい
コン
- 遅い64個の513x513パッチが3,1s(1スレッド)で作成されます。各タイルについて、〜20msのノイズの作成、〜25msの頂点、法線、正接、正接、インデックス。カメラが速く動くとき、ユーザーはタイルのロードに気づくことができます。
- メモリを消費する???
今私はGPUで地形を完全に生成することによってこれをスピードアップする方法を考えていましたが、いくつかの疑問があります:
- シェーダーがすべてのフレームを実行する場合、この計算能力はノイズを何度も計算するために無駄になりませんか?これは、結果をRBGAテクスチャに書き込み、後で頂点シェーダーでディスプレイスメントに使用することで回避できますが、メモリ使用量が増加します。一方、作成が非常に高速になる場合は、表示されているタイルのみをメモリに保持する必要があります。ただし、バッファーを切り離すと、gpu-cpu syncが発生し、アプリの速度が低下する場合があります(私は正しいですか?)
- テレインが頂点シェーダーによって置き換えられたフラットグリッドである場合、CPUで同じ作業を実行して、衝突の特定のポイントで高さと法線を計算する必要があります。
- これは単なる概念ですが、すべてを高速化するために、ビューポートにグリッドを投影することを考えていたため、使用される頂点は最小限に抑えられています。これでうまくいくと思いますか?
私の最後の質問は:
GPUで無限地形を作成するために最もよく/最も速く/広く使用されているテクニックは何ですか?
8
GPUで地形を作成すると、衝突検出、ピッキング検出、または地形とのあらゆる種類のやり取りが難しくなることに注意してください。
—
MichaelHouse
コンピューティングシェーダー(DX10または11)を使用して、GPUでテレインを生成できます。しかし、Byte56が述べたように、GPUとやり取りするには、GPUから値を引き戻す必要があります。msdn.microsoft.com/en-us/library/windows/desktop/…–
—
UnderscoreZero
GPUで地形を作成することは、私には悪い考えのようです。うまくいくかもしれませんが、CPU側でテレインを生成し、標準の描画データをGPUに送信すれば、おそらく少しうまくいくと思います。
—
ベンジャミンデンジャージョンソン
ただ私の経験。私は実際にこれをaparapiで行い、実際に動作するようにした。しかし、実際には、CPUに処理を行わせるよりも遅くなっていました。GPUとの間でデータを送信するオーバーヘッドが原因だと思います。私が正しくリコールした場合、gpuが実際に機能するのは、計算がデータのサイズと比較して大きい(そして絶対的にも大きい)場合のみです
—
Richard Tingle
この記事はあなたにいくつかのアイデアを与えるかもしれません http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
—
Jeremiah Leslie