UnityのVisual Effect Graph(VFX Graph)は、GPUの圧倒的な並列計算能力を活かして、数万〜数百万個のパーティクルをリアルタイムでシミュレーション・描画できる素晴らしいツールです。しかし、魔法のオーラや濃い霧、煙といった「半透明(アルファブレンド)」のパーティクルを大量に放出した際、「カメラの角度を動かすと、奥にあるはずのパーティクルがなぜか手前のパーティクルの上に重なって描画され、前後関係が激しくチラついて立体感が崩壊してしまう」という深刻な描画バグに直面したことはないでしょうか。本記事では、この半透明ブレンドの破綻が発生するグラフィックスの根本原因と、初心者にも分かりやすい例え話、そして立体感を保ちながらGPU負荷を最適化するための設定手順を徹底解説します。
1. 例え話で理解する:『アクリル板の重ね絵』と『目隠しでの並べ替え』
この「半透明パーティクルの前後関係の破綻(ソーティングバグ)」を視覚的に理解するために、「透明なアクリル板(セル画)を何枚も重ねて作る立体アート」を例えに考えてみましょう。
あなたが、手前から奥に向かって「何枚もの半透明のアクリル板(火の粉や煙の粒子)」を順番に重ねて、奥行きのある美しい景色を作ろうとしています。
物理的・視覚的に正しい立体感を作るための絶対ルールは、「一番奥にある背景から順番に、手前に向かってアクリル板を重ねていく(バック・トゥ・フロント)」ことです。そうすれば、奥の板の絵が手前の半透明な絵を通してうっすらと見え、綺麗な透明のグラデーションが生まれます。
しかし、作業を早く終わらせること(描画速度の優先)だけを考えたスタッフ(初期設定のVFX Graph)は、板の奥行き(カメラからの距離)を一切確認せず、「倉庫から運ばれてきた順(GPUメモリのインデックス順)」でデタラメにアクリル板を重ねてしまいました。
その結果、「一番奥にあるはずの巨大な煙の板」が、「一番手前にあるはずのキャラクターの足元の光の板」の上に重ねて置かれてしまいます。透明なはずの境目が不自然に浮き出て、前後関係がめちゃくちゃになり、目が痛くなるようなおかしな絵が出来上がります。これが、「ソーティングなし」によるブレンド崩壊の正体です。この問題を解決するには、スタッフに「アクリル板を置く前に、必ずカメラから遠い順番に並べ替えて(ソーティングして)から重ねてね」と命令する必要があります。
2. 根本的な原因:アルファブレンドの数学的制約とGPUの並列性
技術的に言うと、不透明(Opaque)なオブジェクトの描画では、GPUは「Zバッファ(深度バッファ)」という仕組みを用いて、前後関係をピクセル単位で自動判別します。そのため、どのような順番で描画しても正しい前後関係になります。
しかし、半透明(Transparent)オブジェクトのアルファブレンド計算は、数学的に「描画する順番(奥から手前)」に完全に依存します。アルファブレンドの式は以下の通りです。
最終カラー = ソースカラー * ソースアルファ + デスティネーションカラー * (1 - ソースアルファ)
この掛け算と足し算の順序が変わると、計算結果(最終的な色)が変わってしまいます。したがって、必ず「カメラから最も遠いパーティクル」を先に描き、その上に「手前のパーティクル」を重ね塗らなければなりません。
VFX Graphは初期状態でパフォーマンスを最大化するため、パーティクルごとのカメラ距離の計算や並べ替え(ソーティング)を完全にバイパス(Sorting = None)し、GPUメモリ上に生成された順に直接描画します。数万個のオブジェクトを毎フレーム並べ替える処理は、並列処理が得意なGPUであっても大きな負担になるためです。この仕様により、半透明パーティクルを大量に重ねた際に前後関係の破綻が生じることになります。
3. 解決アプローチ:GPU深度ソーティングの有効化
VFX Graphのエディタ上で、描画を行う Output コンテキストブロック の設定を変更することで、GPU側での高速ソートを有効化できます。
手順1:Output コンテキストの選択と Sorting 展開
- 対象のVFX Graphファイルを開きます。
- グラフの右端にある、描画を担当する Output Particle Quad(または Output Particle Mesh)のヘッダーをクリックして選択します。
- インスペクターウィンドウに表示される Sorting カテゴリを展開します。
手順2:Sort プロパティの変更
Sort パラメータのドロップダウンメニューを開き、値を None(デフォルト)から以下のいずれかに変更します。
- `Depth` (深度ソート/推奨): カメラの視線ベクトル(前方方向)の平行投影距離に基づいてソートします。処理が高速で、一般的なカメラワークにおいて最も安定した結果が得られます。
- `Distance` (距離ソート): カメラのレンズ中心(視点位置)からの絶対的な直線距離に基づいてソートします。広角カメラやカメラがパーティクルの間をすり抜けるような状況でより正確な結果になります。
[Output Particle Quad Inspector]
▼ Sorting
Sort: Depth (None から変更してGPUソートを有効化)
※これにより、Unityは内部的にGPU上で「ビットニックソート(Bitonic Sort)」などの超高速並列ソートアルゴリズムを走らせ、遠い粒子から順にカラーバッファへ書き込むようになるため、半透明の重なりバグが完全に解消されます。
4. パフォーマンスとのトレードオフを抑える実務ガイドライン
GPUソートは強力ですが、モバイルやVR環境では動作負荷が無視できません。以下の最適化と併用してください。
- ブレンドモードの変更(最も効果的): 煙や魔法を「アルファブレンド」ではなく「加算(Additive)」または「乗算(Multiply)」のブレンドモードに変更できるか検討します。加算・乗算は数学的に足し算・掛け算であるため、描画順序が変わっても計算結果が変化しません。つまり、加算ブレンドであればソーティングを行わなくても(
Sort = Noneのままでも)前後関係の破綻が視覚的に発生しないという強力なメリットがあります。 - Capacity(最大生成数)の制限: ソーティングコストはパーティクル数に対して指数関数的($O(N \log^2 N)$)に増大します。ソートを有効にするシステムでは、
Capacityを必要最小限(例:数千個以下)にクランプしてください。