「エフェクトが派手なのはいいが、実機で動かしたらFPSが半分になった」
これはエフェクトアーティストが最も恐れる言葉であり、同時に避けては通れない技術的な壁です。
Z-ファイティングを理解したあなたが次に身につけるべきは、【GPUに優しい、賢いサボり方】です。
Unityの計算の仕組み、スマホのハードウェア特性、そしてポストプロセスの裏側。
これらを知ることで、エンジニアに「これ、重くない?」と聞かれた際に、理論に基づいたカウンター(あるいは納得のいく提案)ができるようになります。
1. 描画コストのピラミッド:なぜそのエフェクトは重いのか
エフェクトの重さを決定づける最大の要因は、「ピクセル・フィルレート(塗りつぶし率)」です。
1画面のピクセルに対して、何回計算を重ねるか(オーバードロー)がすべてを支配します。
重い順ランキング:シェーダーの内部事情
-
Distortion(屈折・歪み)
-
理由: 最も重い。
理由は「計算の順序」にあります。歪ませるためには「背景が完成している」必要があり、一度描き終わった画面をコピーしてサンプリングし直すという二度手間が発生します。
-
-
Transparent(アルファブレンド)
-
理由: GPUにとって、背景の色を読み出し、自分の色と混ぜ合わせ、再び書き込むという
Read-Modify-Writeの工程は、非常にメモリ帯域を消費します。
-
-
Additive(加算)
-
理由: アルファブレンドに似ていますが、計算式が Dest + Source と単純なため、ごくわずかに高速です。
-
-
Opaque(不透明)
-
理由: 最速 軽量。
Zバッファによって「隠れている部分は描かない」という強烈な最適化(Early-Z)が効くため、どれだけ重ねても後ろのピクセルは計算されません。
-
2. ポストプロセスの真実:Bloomの強さは負荷に関係あるか?
ポストプロセスは、文字通り「描画が終わった後」に画面全体にかけるフィルターです。
Bloomの強さと負荷の相関
結論から言うと、「Bloomの強度(Intensity)を上げても負荷は変わりません」。
Bloomの負荷を決定するのは「強度」ではなく、以下の要素です。
-
解像度: 4KなのかHDなのか。
-
Threshold(しきい値): どの明るさから光らせるか(計算量は不変)。
-
Blur Iterations(ぼかしの回数): 何回画面を縮小してぼかしているか。
-
Diffusion(拡散の広さ): どの範囲までピクセルをサンプリングするか。
つまり、「見た目に眩しいから重い」のではなく、「滑らかに光らせるためにたくさん計算しているから重い」のです。
ポストプロセス内の「最重量級」
-
Depth of Field(被写界深度): 画面を大きく、かつ精密にぼかすため、非常にサンプリング数が多く重いです。
-
Motion Blur: 動いている方向に合わせて周囲のピクセルを何度も拾いに行くため、1ピクセルあたりの計算量が跳ね上がります。
-
SSAO(遮蔽感): 深度値を元に「周囲に壁があるか」を全ピクセルでチェックするため、ミドルスペックスマホでは禁忌に近い処理です。
3. 中抜きの「〇」問題:Mesh vs Billboard の損得勘定
「ドーナツ状のエフェクト」を作る際、四角い板ポリゴン(Billboard)に中抜きテクスチャを貼るか、円環状のメッシュ(Mesh)を使うか、どちらが正解でしょうか。
オーバードローの視点
-
Billboard: 見た目は「〇」でも、GPUは四角い板全体(中抜きの透明部分を含む)を「透明なピクセル」として計算し続けます。
-
Mesh: 〇の形に合わせてポリゴンを割れば、「中央の穴の部分」は描画命令そのものが発行されません。
ポリゴンの割りはどの程度が目安か?
「ポリゴン数を増やすのは怖い」と思うかもしれませんが、現代のスマホにおいて、頂点計算(Vertex)はピクセル計算(Pixel/Fragment)に比べて圧倒的に余裕があります。
-
目安: 8角形〜12角形、滑らかに見せたいなら16角形程度。
-
判断の黄金律: 「透明なピクセルの面積が、全体の30%〜50%を超えているなら、メッシュ化してその部分を削り取る方が軽い」
4. ディストーションはなぜ「罪」なのか
ディストーションが重い最大の理由は、【テクスチャサンプリングの回数と場所】です。
計算の仕組み
通常のシェーダーは自分のテクスチャを1回見れば済みますが、ディストーションは
-
歪み用の法線テクスチャを読み込む。
-
その法線情報を元に、計算された「背景画像」の全く別の座標を読みに行く。
GPUは「隣り合ったピクセルは似たような場所のメモリを読むはず」と予測して高速化していますが、
ディストーションは「右のピクセルは背景の左側を読む」といったバラバラな動きをするため、キャッシュ効率を破壊します。
これが、サンプリング数以上の重さを生む原因です。
5. ライティングのコスト:中スペックスマホでPoint Lightは使えるか?
エフェクトから発火時に Point Light を出す演出、かっこいいですよね。
しかし、中スペックスマホでは非常に危険です。
Point Lightの重さの理由
-
描画パスの増加: Forwardレンダリング(スマホの主流)では、ライトが1つ増えるたびに、そのライトの影響を受けるオブジェクト(地面、壁、キャラ)の描画計算が、もう一周走ります。
-
影の計算: もしライトに
Shadowを入れたら、その瞬間に死にます。
影の計算は「ライト視点からの描画」をもう一度行うため、負荷が倍増します。
対策: 中スペックスマホなら、Point Lightの代わりに「加算の板ポリゴンを地面に置く(Fake Light)」か、Shader Graphでキャラクターの足元を光らせる処理を組み込む方が遥かに健全です。
6. Soft Particleの進化:なぜ軽くなった?
Built-inパイプライン時代、Soft Particleは「高級品」でした。
-
旧Built-in: 深度情報を得るために、カメラが「深度パス」という特別な描画を事前に行う必要があり、その準備だけでコストがかかっていました。
-
新URP: 現代のスマホやゲーム機は、描画の過程で自然に「深度テクスチャ」を生成・保持する仕組みが強化されました。これを再利用するだけなので、Soft Particleを有効にすること自体の「追加コスト」が激減しました。
7. 「重なりの範囲」の罠:3枚の煙、どこに置く?
「煙が3枚重なっている」とき、重なり方が負荷を左右します。
-
カメラ前面(フルスクリーン)に3枚:
画面の全ピクセル(例:フルHDなら約200万ピクセル)に対して、3回分のアルファブレンド計算が走ります。合計600万回の計算。これが最も重い状態です。
-
画面端(部分的)に3枚:
エフェクトが映っている範囲が画面の10%なら、計算量は 600万 x 0.1 = 60万回。
アーティストができる工夫:
「大きな煙1枚」で画面を隠すのではなく、「小さな煙を組み合わせて、部分的に密度を濃くする」ことで、全体の描画ピクセル面積を減らすことができます。
8. OSの違い:iOS vs Android の戦い
プラットフォームによっても、負荷の出方は変わります。
iOS (TBDRアーキテクチャ)
iPhoneのGPU(PowerVR系)は TBDR (Tile-Based Deferred Rendering) という仕組みを採用しています。
-
画面をタイル状に分割して処理するため、「アルファブレンド」の処理が実は非常に得意です。
-
ただし、Retinaディスプレイにより解像度が非常に高いため、物理的なピクセル数による負荷(フィルレート)が爆発しやすい傾向があります。
Android (多種多様)
-
高性能なSoCから、メモリ帯域が極端に細い低価格帯まで存在します。
-
特に低価格帯のAndroidは、テクスチャの読み込み(サンプリング)や、透明度の計算が致命的に遅い場合があります。
Androidをターゲットにするなら、常に「最悪のケース」を想定してオーバードローを削る必要があります。
結論:エフェクトの「健康状態」をチェックする3か条
-
Overdrawを確認する: UnityのScene Viewの表示モードを
Overdrawにし、真っ赤(または白)になっている場所がないかチェックする。
(ただし、画面全体にかけるエフェクトがある場合は、1枚でも減らすようにする) -
面積を削る: 中抜きのあるテクスチャはMesh化を検討し、透明なピクセルにGPUの時間を無駄遣いさせない。
-
ポストプロセスと仲良くする: Bloomは「強度」ではなく「サンプリングの質」で重さが決まると理解し、過剰なBlur設定を避ける。
