Skip to content
第15回 GPU完結での衝突判定とパーティクル生成

1 / 4 パーティクルとGPUイベント ​

このステップの目的

VFX Graph内のシステムと、システム間をつなぐGPU Eventの役割を理解します。
衝突する粒子と、衝突に応じて生成する粒子の処理を整理します。

GPU Eventで別のシステムへ生成を通知する ​

VFX Graphは、GPU完結で衝突判定を得ることが可能です。
GPUではCPUほど柔軟なデータ構造を扱うのは難しく、複雑な衝突判定は限界があります。

代わりに、GPU内で完結できる数式ベースの衝突判定や、SDF(Signed Distance Field)を使った衝突判定などが用いられます。

数式ベースの衝突判定は、例えば平面との衝突や球との衝突など、簡単な形状に対して有効です。

SDFを使った衝突判定は、複雑な形状の表面との衝突を効率的に扱えます。
SDFは空間内の各点が形状の表面からどれだけ離れているかを示す場で、GPU上での距離計算に適しています。

ただし、ポリゴンベースの衝突判定に比べると、SDFは精度が劣る場合があります。
特に細かい凹凸や鋭い角を持つ形状では、距離場の解像度に依存して衝突判定の精度が制限されます。

VFX Graphでは、こうした衝突判定の結果を使って、別のシステムへ粒子の生成を通知できます。

GPUでのポリゴンベースの衝突判定

ポリゴンベースの衝突判定を行うのは計算コストが高く、通常あまり使われません。
現在は技術が進み、GPU上でポリゴンベースの衝突判定を行うことによるレイトレーシングやリアルタイム物理計算が可能となっています。
ただ、Compute Shaderを使ったポリゴンベースの衝突判定は依然として計算コストが高く、用途は限られます。
DirectX 12のハードウエアレイトレーシング機能を利用できれば高速な計算が可能ですが、対応しているGPUが必要です。

雨粒と波紋 ​

雨粒パーティクルのUpdateで水面との衝突を調べ、検知の際にはGPU Eventで通知を出します。
GPU Eventからは、別のシステムのInitializeを呼び出すことができます。

つまり、あるパーティクルが衝突を検知したときに、GPU Eventを通じて他のパーティクルを生成すれば、親である雨粒パーティクルが水面に当たった際に、子パーティクルとして波紋や飛沫のエフェクトを発生させることができます。

親と子は別のパーティクルなので、寿命、位置、大きさなどの初期設定が別途で必要です。

一つのGraphに複数のシステム ​

VFX Graphでは、一つのGraphに複数のシステムを置き、それぞれに異なる寿命・動き・描画方法を設定できます。
Contextの基本は、第13回の発生と初期設定を参照してください。

RainRipples.unityを開き、Visual Effectが参照するRainRipples.vfxを開いてください。
このGraphには、雨粒、波紋、飛沫を処理する三つのシステムがあります。

雨粒は下へ移動し、水面に到達した時点で波紋と飛沫が生成されます。

通知と初期値の引き継ぎを分ける ​

GPU Eventは、子パーティクルを何個生成するか以上の指示はしません。
場所、色、寿命といったパラメーターは、子パーティクルのInitializeで設定してください。

親の値を初期設定に使う場合は、Sourceから読み取り設定することが可能です。
Sourceは、その子を生成するイベントを出した親のデータです。
例えば親の位置を子のPositionへ設定すれば、イベントを出した親の近くに子を配置できます。

この回では、親のUpdateで衝突を調べ、GPU Eventで生成を通知し、子のInitializeで位置を設定します。
続くステップでは、この三つの処理を順に確認します。

チェックリスト
  • 一つのGraphに複数のシステムを置く理由を説明できる。
  • 親のUpdateから、GPU Eventを経て子のInitializeへ通知する流れが分かる。
  • 子の生成を通知する処理と、子の初期値を決める処理を区別できる。