SoftParticles サンプル
Path
Source | SDK ルート\Samples\C++\Direct3D10\SoftParticles |
実行可能ファイル | SDK ルート\Samples\C++\Direct3D10\Bin\platform\SoftParticles.exe |
サンプルの概要
パーティクル システムは、ゲームでボリューム エフェクトを作成するための一般的な方法です。このシステムを使って、炎、雲、煙、埃、光線、魔法の呪文などをシミュレートできます。よく使われるテクニックでは、2D カメラにアライメントされた、それぞれのパーティクルを中心とするクワッドを使用して、パーティクルが表すボリュームを表します。クワッドはカメラに従うので、3D ボリュームを埋める物質の効果を与えます。しかし、パーティクルを視覚化するために使用している 2D スプライトがワールド ジオメトリと交差するときに、この効果が失われることがあります。2D クワッドと 3D ワールド ジオメトリの交差によって、ハードな直線が生成されます — 線の片側がパーティクルで、もう一方の側がワールド ジオメトリです。図 1 はこの例を示しています。
Figure 1. ハードでフラットなパーティクル
深度をもつ 2D パーティクル
この問題に対処する最初の方法は、ピクセル シェーダーから出力される深度とパーティクル テクスチャーに格納されている深度を混合することです。これによって、ワールド ジオメトリとの交点がパーティクルの輪郭に従うようになります。図 2 はこの例を示しています。
Figure 2. 深度パーティクル
2D ソフト パーティクル
基本フラット パーティクル システムでは、パーティクル クワッドがジオメトリと交差する線は、パーティクルが実際には 3D でないために生じる副産物です。これを避けるために、サンプルは深度バッファーをテクスチャーとして読み戻すことができます。シェーダーでは、この深度値がサンプリングされ、パーティクルの現在のピクセルに対応するレンダリングの深度値と比較されてテストされます。バッファー内の深度値の間の差に応じてアルファ値が増え、次にピクセル シェーダーから書き出される深度が減ります。その結果、パーティクルはシーン ジオメトリとの交点に近くなるほど透明さが増します。
Figure 3. 2D ソフト パーティクル
深度ソフト パーティクル
深度を出力するパーティクルにも同じ方法を使用できます。唯一の違いは、深度バッファーと比較される深度が、クワッドからの深度ではなく、クワッドからの深度にパーティクル テクスチャーに格納されている深度を加えた深度であることです。
Figure 4. 深度ソフト パーティクル、例
Figure 5. 深度ソフト パーティクル、説明
2D パーティクルのアニメーション
2D パーティクルをアニメーションするために、このサンプルは、ボリューム テクスチャーに格納されている一連のアニメーション化されたパーティクル テクスチャー フレームを使用します。ボリューム テクスチャーの最初のスライスは、アニメーションの最初のフレームを格納します。最後のスライスは最後のフレームを格納します。パーティクルのエイジとして、シェーダーはそのエイジ (この場合、範囲 [0..1] の浮動小数点数) を使用して 1D テクスチャーのカラーをルックアップします。このカラーはパーティクル全体のカラーをモジュレートし、パーティクルがその生成時に近い時点では暗く、消滅の直前に明るく見えるようにします。
ボリューム パーティクル
サンプルで使用しているボリューム テクニックは、パーティクルに 2D パーティクルのフラットな外観の代わりに、真の 3D ボリュームの外観を与えます。これを実現するために、サンプルは、カメラにアライメントされたパーティクル クワッドに囲まれた仮想 3D プリミティブを通じて光線をトレースします。この場合、サンプルは球を仮想プリミティブとして使用します。球を選んだのは、主に 3 つの理由によります。第 1 に、いつでも球をカメラにアライメントされたクワッドで囲むことができます。第 2 に、球は非常にシンメトリックな形状です。どの方向に置いても同じに見えます。第 3 に、光線と球の間の交点を簡単に計算できます。
主に以下のプロセスを実行します。パーティクルは、ピクセル シェーダーに到達するまで、2D テクニックと同じ方法で処理されます。ピクセル シェーダーは、視点からクワッド上で描画されているピクセルまでの光線を計算します。
Figure 6. ボリューム パーティクル、主なプロセス
次に、この光線とパーティクル クワッドによって囲まれた仮想球の交点を計算します。交点が生成されない場合、光線は破棄されます。
Figure 7. ボリューム パーティクル、交点の計算
シェーダーは、固定ステップ サイズを使って、1 つの交点から他の交点に移動するために必要なステップの数を決定します。その間に、数オクターブのノイズがサンプリングされます。これらは、4 チャンネル ボリューム テクスチャーに格納されます。RGB チャンネルは、逆密度グラデーションを含みます。アルファ チャンネルは、密度を含みます。ライティングはそのポイントで、そのポイントの球の中心からの法線と密度グラデーションの組み合わせを使って計算されます。各ステップが前のステップに加算され、最終結果がボリューム内でトレースされた光線の不透明度およびカラー値となります。この結果は、特定の外観を得るために、いくつかの全体的な不透明度値によって微調整されます。
Figure 8. 2 つの交点の間の移動
光線が球から出る前に深度バッファーと交差する場合、シェーダーは後側の出口ポイントを深度バッファーの交点に変更します。必要であれば、ワールド ジオメトリとのソフト交差を得るために、アルファをサンプルと深度バッファーの間の距離を基に減衰することができます。
Figure 9. 光線と深度バッファーの交差
Figure 10. ハード ボリューム パーティクル
Figure 11. ソフト ボリューム パーティクル
ボリューム パーティクルのアニメーション
パーティクルはアニメーションしていますが (ソースから離れていく)、さらに詳細な動きを得るために、ノイズ ボリューム テクスチャーでのルックアップの計算に使用したテクスチャー座標をアニメーションします。テクスチャー座標を 1 つの方向に移動すると、煙が反対方向に移動しているように見えます。