ジオメトリシェーダーから手続き型で生成された世界に物理を組み込むにはどうすればよいですか?


10

基本的に、CPUからGPUにコヒーレントノイズを生成する必要をなくしたいと思います。そこから、ボクセルポイントの密度としてこのノイズを使用して、3次元の世界の地形も生成したいと思います。この後、これらの密度を取得して、世界の地形を表すポリゴン化(頂点を生成)したいと思います。

これで問題ありません。でも、リアルタイムで世界を動的に変形させたい。この時点に到達すると、頂点をCPUに戻して、衝突検出や、GPUではなくCPUに関与させたいすべてのゲーム計算などを実行しようとして問題が発生します。

だから問題は、どうすれば他のものの間の衝突に対処するために頂点のサブセットをCPUに戻すことができますか?

そしてもう1つの質問:頂点のセットを取得し、それらからGPUでインデックスを生成する簡単な方法はありますか?

これらのさまざまな目的でどのようなシェーダーを使用する必要があるのか​​、また混乱しています。密度を収集するためにピクセルシェーダーを使用し、頂点からの地形生成を処理するためにジオメトリシェーダーを使用して、どういうわけか動的変形を行うために頂点シェーダーを組み込む人々の話を聞きました。

C#4.0、.NET 4.0、およびXNA Game Studio 4.0を使用しています。


1
タイトルでジオメトリシェーダーを使用していると言いますが、XNA 4.0がDirectX 10を必要とする限り(より均一なプラットフォーム用に開発を容易にするため)、XNA4.0を使用しているとも言いますが、 SM3.0機能のみをサポートしているため、ジオメトリシェーダーはありません。forums.create.msdn.com/forums/p/31369/178924.aspx
Roy T.

これで、XNAを使用したり、デザインをやり直したりすることはなくなりました。ご指摘いただきありがとうございます。私はそれを調べていましたが、この制限に気付きませんでした(SM 4なし)。ただし、XNAを考慮せずに問題がまだ残っていると思います。DirectXのみの観点から、私が望むことを行う方法はありますか?または、おそらくXNAの頂点シェーダーを使用しますか?

1
変形や生成が遅すぎるという実証済みのテストケースがない限り、XNAは引き続き有効です。また、別のテストケースでGPUの変形+生成が行われ、データをCPUに戻す方が高速であることを証明したこともわかります。:)
Roy T.

確かに。XNAを使用してすべてをCPUに保持すると、8コアと8スレッドでスレッドごとにテレインの複数のセクションを並列化するCore i7で約3分間で約100万の頂点が得られることがわかりました。リアルタイムでそれを行おうとし、うまくいけばプレーヤーが見る前に地形をレンダリングすると、毎秒約20フレームを達成しました。したがって、テストケースは確実に各メソッドで順序付けられています。
マイケルJ.グレイ

回答:


3

XNAはジオメトリシェーダーをサポートしていないため、DX 10を使用しているかのように答えます。基本的に3つのオプションがあります。

ジオメトリシェーダー ジオメトリシェーダーは、実際に頂点を変更して頂点バッファーに追加できます。これをCPUに読み戻すことができます。まだ調べていませんが、可能です。

CPUだけを使用する次に、CPUで 計算してみませんか?シェーダーのGPUで実行されるという事実は、変形アルゴリズムがローカライズ可能であることを示しています。つまり、衝突チェック用の関連パーツだけを簡単に生成できます。

例えば、先ほどセーリングゲームを作りました。海は、頂点シェーダとジオメトリシェーダを使用して、波で水を変形させました。私はCPUで計算された同じアルゴリズムをボートの下のほんの数ポイントで波の中でのボートの動きに使用しました。ボクセルマップに対しても同様のことができると思います。

ピクセルシェーダー 最後のオプションです。これも質問で説明しました。ピクセルシェーダーで密度を生成し、それを3Dテクスチャに書き込みます。CPUとシェーダーからこれに無害にアクセスできます。ピクセルシェーダーはこのタスクに最適ですが、この方法には多くのオーバーヘッドがあります。ボリュームテクスチャのレンダリング、および頂点とジオ内からのサンプリング。シェーダー、およびテクスチャーをCPUに読み込む必要があります。

あなたのプロジェクトの詳細はわかりませんが、私は常にCPUを使用します。シェーダーの密度も必ず計算してください。ただし、レンダリングにはグラフィックカードを使用してください。


私たちが抱えていた主な問題は、GPU-CPUバリアでした。ある意味では、GPUでテレインを生成してレンダリングしたら、衝突やその他のことを行うために、CPU側でテレインがどのように見えるかをどのように理解するのでしょうか。CPUでそれを維持するというあなたの考えは妥当だと思います。つまり、アルゴリズムをかなり最適化して、生成する地形を少なくすることができます。他の誰かが応答を持っているかどうかを確認するために、1〜2日であなたの応答をソリューションとしてマークします。いくつかの別の考えを誘発してくれてありがとう。
マイケルJ.グレイ

あなたの航海の例では、波をはねているボートの波形結果をGPUに簡単に接続できませんか?
減速

1
同じレンダリングシステムを維持できます。つまり、GPUでテレインを生成してレンダリングしますが、CPUで必要なテレインの部分をミラーリングします。同じアルゴリズムと同じパラメーターを使用すると、画面に表示されるのと同じ地形がCPUで得られます。
ハネシュ2011

@Danielウェーブアルゴリズムを直接使用することはできませんが、各ボートが背後に「引きずる」ディスプレイスメントテクスチャを使用して、ボートの航跡に従って水メッシュを変形することが可能です。
ハネシュ2011

ああ!それはいい考えです :)。しかし、それはおそらく複数の船舶をうまくサポートしていません。
減速
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.