煙や爆発のリアルタイムシミュレーションとレンダリングは、ライティングの相互作用やダイナミクスの複雑な性質のため、いつも困難な課題となってきました。
リアルタイム技術がより進化したことで、ボリュメトリックな流体シミュレーションやレンダリングも使われるようになってきていますが、ゲームで広く使われるようになるにはまだコストがかかりすぎるように思われます。ですから、レンダリングにまつわる多くの問題がそうであるように、できるだけ低コストで望みに近い外観のものを作ることが重要になってきます。
Unity 2022.2 TECH ストリームでは、ベイク済みのシミュレーションから煙をリアルにレンダリングできる、完全なエンドツーエンドのワークフロー(DCC から Unity まで)が実現しています。このワークフローは、あらゆるプラットフォーム、あらゆるライティング条件へとスケールします。このソリューションはすぐに使えるベイク済みマップのライブラリも備え、誰でも簡単に煙のエフェクトのビジュアルを一味違ったものにできるように設計されています。
ゲームにおける煙のレンダリングは、テクスチャ付きのスプライトで行われることがほとんどですが、これは完全なボリュメトリックライティングの計算がリアルタイムな予算に対して高すぎるためです。しかし、スプライトに関して最もよくある質問の 1 つに、平坦な 2D ジオメトリをベースにした煙のライティングはどうすればいいのかというものがあります。
法線マッピングやカラーマップを完全にベイクするなど、いくつかのアプローチが存在します。しかし、これらのアプローチは、リアルさと拡張性のいずれか、あるいは両方に欠けています。
この問題を解決するための別のアプローチとして、6 方向から来る光に対する煙のライティングに対する反応を含めたライトマップのセットを使用する 6 ウェイライティングが登場しました。これらのライトマップは、アルファチャンネルとオプションのエミッシブマスクとともに、2 枚のテクスチャのセットにベイクされます。
これらのテクスチャを搭載することで、さまざまなライティング条件下で煙にダイナミックな陰影をつけることができます。他の技術では実現できなかった、背面から光を当てたときの内部シャドウやライトリムなど、ボリュメトリックライティングを表現することができます。
カラー、吸収、発光グラデーション、ライトマップの再マッピングなど、同じテクスチャをベースにさまざまな効果を作り出すためのコントロールが用意されています。これにより、さまざまなシナリオでアセットを再利用することが可能になります。
6 ウェイライティング、6 ポイントライティング、6D ライトマップ、6 ポイントライトマップ、スモークライティングなど、さまざまな名前で知られるこのテクニックは、数多くの AAA ゲームで使用されています。実際のゲーム制作において VFX 技術ディレクターとして活躍した人物が書いたこの技術の素晴らしいガイドをぜひチェックしてください。
この技術を採用する主なメリットは以下の通りです。
このテクニックについて注意すべきは、平坦に見えてしまう点です。もしこのテクニックがリアル感の高いライティングによってボリューム感のある印象を与えるとしても、見せているのはあくまでテクスチャシートであり、3D のボリュメトリックエフェクトではないのです。そのため、背景のエフェクトやスチームや爆発などの装飾的なエフェクトに使うのが最適です。より深みを出すには、このエフェクトをより多くのパーティクルに使用するか、ボリュメトリックエフェクト(例えば、ローカルボリュームフォグや HD レンダーパイプラインのボリュメトリックなマテリアル)と組み合わせる必要があります。
ここでは、代表的な使用例を紹介します。
ライトマップの生成プロセスを支援するツールをいくつか提供しています。VFXToolbox リポジトリには、Houdini と Blender 用のエクスポーター、および 6 ウェイライトマップのフリップブックの再パッケージ化や色の強度の調整に使用できる Image Sequencer のような他のツールも含まれています。
ツールのインストールに関するすべての説明は、Readme.txt に記載されています。なお、このツールには 2 つのバリエーションがあります。1 つ目は Object コンテキストにあります。OpenGL のレンダーノードをベースにしており、非常に高速です。
2 つ目のバリエーションは、Stage コンテキストにあり、Karma レンダラーを核として構築されています。どちらもライトマップ、エミッシブ、およびフリップブックのエクスポートのレンダリング機能を備えています。
アドオンをインストールするには、Blender の標準的な手順に従います。Preferences メニューから、unity_6way.py をインストールし、アドオンを有効にします。その後、3D ビューの Unity カテゴリにパネルが表示されます。
このアドオンでは、ライトマップのレンダリング、エミッシブチャネルのレンダリング、基本的なコンポジションの実行のほか、ライトマップのシーケンスからフリップブックを作成することが可能です。これらの作業は一度に行うことも、別々に行うこともでき、それぞれの段階で個別の設定を行い、最終的な結果をコントロールすることができます。
ツールによっては、6 ウェイライトマップをエクスポートするための公式またはユーザーが作成したオプションやプラグインがすでに提供されている場合があります。
例えば、EmberGen では、Render ノードで「Six point」というオプションを使用することができます。なお、このワークフローは公式にはサポートされていません。なぜなら、これらのマップの光の強さをコントロールすることができないからです。しかし、手動で調整すれば十分使える場合もあります。
また、お手持ちのツールを使って 6 ウェイライティングマップを構築することも可能です。そのためには、以下に説明する手順に従い、フォーマットパッキングを行います。
ライトマップをベイクするために、異なるライティング設定でオブジェクトを 6 回レンダリングする必要があります。
レンダリングごとに、カメラに対して上下左右、前後と方向を変えた白色のディレクショナルライトを使っています。
火などのエミッシブの情報はライトマップの一部ではないので、後で別のテクスチャでレンダリングするか、ライトマップの追加のチャンネル内にパッキングすることができます。
6 ウェイライティングマップのデータは、2 枚の RGBA テクスチャに収められます。6 つのライトマップの方向は、2 枚のテクスチャのカラーチャンネル(赤、緑、青)にそれぞれ格納されています。
さらに、1 枚目のテクスチャのアルファチャンネルは、透明度を含んでいます。これにより、2 枚目のテクスチャのアルファチャンネルを追加チャンネルとして利用できるようになります。現在のワークフローでは、その追加チャンネルにエミッシブの部分を詰め込むという選択肢を取れます。
テクスチャを選択すると、Unity エディターのプレビューウィンドウで、チャンネルを個別に調べることができます。
他のツールで作成されたライトマップは、これらのチャンネルを異なる順序でパックすることができます。Unity 内部でインスペクターを使ってチャンネルを並べ替える基本的な機能はありますが、あるテクスチャから別のテクスチャにチャンネルを移動させる必要がある場合は、画像エディターが必要になる場合があります。
煙のライティングは HDRP のライトループに直接組み込まれているため、煙に影響を与えるライトの数に特定の制限はありません。もちろん、ライトの数が増えれば増えるほど、計算量は増えていきます(ライトレイヤーを活用すれば、これを軽減することができます)。
ディレクショナルライト、ポイントライト、スポットライト、矩形ライト、リニアライトなど、あらゆるタイプの直接光を扱うことができます。また、雷、電気の火花、燃え上がる炎、ホタルなどを表現する煙のエフェクトの中のライトも非常に印象的な結果を生み出します。
各ライトについて、まずパーティクルに対する方向を決定し、この方向を使って異なるライトマップをブレンドすることが重要です。エリアライトの場合、私たちはライトの最も近い点を特定して方向を計算する Most Representative Point 方式を採用しています。
パーティクルも間接ライティングの影響を受けます。特にライトプローブ、アダプティブプローブボリューム(APV)、アンビエントプローブ、ライトプローブプロキシボリューム(LPPV)からは影響を受けやすく、シーンでどのタイプの間接ライティングが有効になっているかによって影響が変わります。速度のパフォーマンスを最高にするなら、環境光のみのモードを使い、ライトループを完全にスキップして、非常に安価なライティング計算を行うのがよいでしょう。
パフォーマンスを考慮し、プローブの寄与は頂点シェーダーで評価した後、ピクセルシェーダーに補間される。つまり、クアッドを出力とする場合、プローブはクアッドの 4 隅でのみ評価されます。APV のような空間的に変化するプローブでは、1 つまたは複数の頂点が壁の片側に、パーティクルの残りの部分が反対側に来ることがあります。この場合、プローブの寄与が正しくなくなり、見た目のアーティファクトを生じさせる原因となります。より多くの頂点を持つテッセレーションメッシュを使用することが解決策の 1 つとして挙げられます。なお、一般的に屋外のシーンでは問題ありません。
このモデルでは、煙は完全に拡散すると考えられるため、スペキュラー反射の寄与は評価されません。これは、例えば、リフレクションプローブが 6 ウェイで煙を照らしている時、パーティクルに影響を与えないことを意味します。
また、煙に色をつける方法も 2 種類用意しています。これを実現するには、ライトマップからカラー成分ごとの光の吸収を導出する方法(色つきの煙をよりリアルに動かせる)か、単純な乗算(最も安価な方法)を使用することができます。
Visual Effect Graph による 6 ウェイライティングのレンダリング出力は、エフェクトの見た目をカスタマイズしたり、同じライトマップを再利用して異なるエフェクトを作成するためのさまざまなコントロールを提供します。
わずか数分で美しい 6 ウェイの煙を追加することができます。Unity 2022.2 以降で、Visual Effect Graph と HDRP を使う必要があります。
素早く試していただけるよう、すぐに使えるマップライブラリを作りました。VFX Toolbox などを使って自由に加工・パッキングできる高忠実度のアセットと、ゲーム用に軽量化されたコンパクトなバージョンの両方を提供しています。
これらのマップと 6 ウェイライティングを使ったエフェクトは、以下の手順で作成します。
Visual Effect Graph 全般については、Unity のウェブサイトをご覧いただくか、e ブック「The definitive guide to creating advanced visual effects in Unity」をお読みください。
6 ウェイライティングに関する次回の記事では、シェーダーグラフの統合とユニバーサルレンダーパイプライン(URP)のサポートに焦点を当てる予定です。また、この技術に内在するいくつかの制限(シャドウを受けると平坦な感じになってしまう、パーティクルに対して局所的なライトマップや近隣のオクルージョンを考慮しないライトマップなど)を克服するアイデアもあります。
また、Visual Effect Graph に Volumetric Fog 出力を追加し、ビジュアルエフェクトでボリュメトリックフォグを生成できるようにする作業も行っています。6 ウェイライティングと組み合わせることで、煙のエフェクトをさらに磨くことができます。これは Unity 2023.1.a25 ですでに利用可能です。
もちろん、実際のボリュメトリックな流体シミュレーション、再生、レンダリングも視野に入れています。これらにより、ターゲットとするプラットフォームや予算に応じて、美しくリアルな煙のエフェクトをレンダリングするための技術をすべて揃えることができます。
ぜひ、専用の Unity フォーラムスレッドにフィードバックやご質問をお寄せください。新機能の提案や検討中の機能への投票は、レンダリングの公開ロードマップで行うことができます。