説明
このサンプルは、ポイント スプライトを使用して 3D パーティクル システムを実装する方法を示します。カスタム頂点シェーダーを使用して、グラフィック カードでパーティクル全体をアニメーション表示するので、最小の CPU オーバーヘッドで多数のパーティクルを描画できます。
サンプルの概要
多数のパーティクルを表示する場合、すべての要素を更新し、描画を行う GPU にパーティクルの最新位置を転送する際の CPU の処理量がゲームのボトルネックになりがちです。それを避けるため、このサンプルでは、パーティクルのアニメーションを GPU へ委任するので、アクティブなパーティクルの数に関係なく CPU のオーバーヘッドを低く抑えることができます。パーティクルのアニメーションを GPU にまかせることにより、それ以外のゲームプレイ、物理特性、AI などの処理のために CPU を空けておくことができます。
新しいパーティクルが作成されると、CPU は、そのパーティクルが作成された位置、速度、および時刻を頂点構造体に格納します。この頂点を GPU にアップロードした後、CPU が再度それを扱う必要は一切ありません。フレームごとに、現在の時刻が頂点シェーダー パラメーターとして設定されます。GPU は、パーティクルを描画するときに、作成時刻 (頂点データの一部として格納されている) を現在時刻と比較することで各パーティクルの世代を割り出すことができます。開始位置、速度、および世代がわかれば、シェーダーは現在の位置を計算して、その場所にポイント スプライトを描画できます。
新しいパーティクルは常に頂点バッファーの末尾に追加され、古いパーティクルは先頭から削除されます。すべてのパーティクルが同じ時間だけ存続し、アクティブなパーティクルは常に、連続するバッファー領域にひとまとまりになっているので、1 回の呼び出しですべてを描画できます。CPU は新しいパーティクルの頂点をバッファーの末尾に追加し、古いパーティクルの頂点を先頭から削除しますが、バッファーの中部にあるアクティブなパーティクルに対しては何も行う必要がありません。数千ものパーティクルがあるゲームでも、通常はフレームごとに数回の作成と削除だけで済むので、CPU の負荷は非常に低くなります。
このサンプルは 3D で動作しますが、正行列をカメラ射影行列に設定すれば、同じコードを使用してより効率的な 2D パーティクル システムを実現できます。