拙訳
- データ構造:
- Particle Pool:パーティクルを格納するための領域
- Dead List:Particle Poolの未使用領域を指すインデックスのリスト
- Sort List:Particle Poolの使用中領域を指すインデックスと深度値のリスト
- フレーム:
- エミット:Dead Listからインデックスをもらって、パーティクルを初期化する
- シミュレート:パーティクルを更新して、生きているものをSort Listに、死んでいるものをDead Listに、そのインデックスを入れる
- ソート:Sort Listを深度順にソートする
- アルファブレンディングで必要だが、加算ブレンディングでは不要
- Bitonic SortはGPUでうまく並列化できる
- 描画:Sort Listを介してパーティクルのデータを読み取り、ビルボードを描画する
- オーバードローが辛いなら、透明部分を切り詰めたビルボードを使ったり、レンダーターゲットの解像度を半分にしたりする
- タイルベースにしたり、寄与率の低い部分を省略したりする手もある
- アルファ値が大きいとブレンドしても色が変化しなくなるので、前から後にブレンドしてアルファ値がしきい値以上になったら処理を終了することができる
- 衝突判定:
- プリミティブ、ハイトフィールド、ボクセル、深度バッファ、などが使える
- 深度バッファでの判定は、パーティクルの位置と深度値のZをビュー空間で比較する
- 跳ね返り計算には、Gバッファの法線を使ったり、深度バッファの複数点を使ったりする
- 深度値を使う場合は不連続性に注意すること