1

(基本的な) ボクセル エンジンを実行し、水システムは次のようになります (基本的には機能すると思います): https://www.youtube.com/watch?v=Q_TdeGIOOts (私のゲームではありません)。
水の値は浮動小数点数の 3D 配列に格納され、0.05 秒ごとに下と隣接するボクセル (y-1、x-1、x+1、z-1、z+1) をチェックして水の流れを計算し、追加します。値。
このシステムは、少量の水 (70+ fps) に対しては正常に機能しますが、8 つ以上のチャンクで水の計算を開始すると、計算が多すぎます。(すべてのレンダリングまたはメッシュ作成を無効にして、それがボトルネックであるかどうかを確認しました。それは純粋にフロー計算です)。
私は経験豊富なプログラマーではないので、すでに行ったようにコルーチンで計算を行うことを除けば、どこから最適化を開始すればよいかわかりません。
この投稿では: https://gamedev.stackexchange.com/questions/55414/how-to-define-areas-filled-with-water (下部近く) Boreal は、計算シェーダーで実行することを提案しています。これは私のために行く方法ですか?そして、どうすればそのようなことをすることができますか?
どんな助けでも大歓迎です。

4

1 に答える 1

1

実際にボクセル ベースのシミュレーションを計算している場合は、サイズが大きくなるにつれて計算の数が幾何学的に拡大するため、ボリュームが大きくなると処理能力がすぐに不足してしまいます。

コンピューティング シェーダーは、非常に異なるプログラミング パラダイムであり、慣れが必要ですが、大規模な並列計算をすばやく実行するのに最適です。計算シェーダーは、バッファーの内容 (つまり、私たち民間人にとっては「テクスチャ」) を見て、非常に迅速に処理を行います。この場合、バッファーはおそらく、ピクセル値が水のセルを表すバッファー/テクスチャになります。上下にインクリメントするような非常に単純なことをしたい場合、計算シェーダーは GPU の並列処理能力を使用して非常に高速に実行します。

難しいのは、GPU が並列処理用に最適化されていることです。これは、「texelA.value += texelB.value」のようなコードを記述できないことを意味します。余分な作業を行わなければ、バッファの各フラグメントは、他のフラグメントで何が起こるかをまったく知らずに処理されます。他のテクセルを参照するには、何らかの方法でテクスチャを再度読み取る必要があります。一部の手法では、オフセットを使用して 1 つのテクスチャを複数回読み取ります (この GL の例では、これを行ってブラーを実装します。他の手法では、テクスチャを繰り返し処理し、結果を一時的なテクスチャに入れ、次にそれを再処理します。

10,000 フィート レベル: はい、計算シェーダーは、大量の自己相似計算を伴うため、この種の問題に適したツールです。しかし、すぐに実行するのは簡単ではありません。これまでに従来のシェーダー プログラミングを行ったことがない場合は、まずそれを見て、GPU の動作に慣れることをお勧めします。本当に基本的なツール (if-then-else またはループ) でさえ、パフォーマンスへの影響と GPU プログラミングでの使用が大きく異なり、その違いを理解するには時間がかかります。この記事の執筆時点 (2013 年 1 月 10 日) では、Nvidia と Udacity がコンピューティング シェーダー コースの紹介を提供しているようです。

FWIW には、コンピューティング シェーダー用のかなり最新のハードウェアも必要です。これにより、視聴者が制限される可能性があります。

于 2014-01-11T19:09:32.757 に答える