Unity を検索

Realistic smoke lighting with six-way lighting in VFX Graph | Hero image
Realistic smoke lighting with six-way lighting in VFX Graph | Hero image

煙や爆発のリアルタイムシミュレーションとレンダリングは、ライティングの相互作用やダイナミクスの複雑な性質のため、いつも困難な課題となってきました。

リアルタイム技術がより進化したことで、ボリュメトリックな流体シミュレーションやレンダリングも使われるようになってきていますが、ゲームで広く使われるようになるにはまだコストがかかりすぎるように思われます。ですから、レンダリングにまつわる多くの問題がそうであるように、できるだけ低コストで望みに近い外観のものを作ることが重要になってきます。

Unity 2022.2 TECH ストリームでは、ベイク済みのシミュレーションから煙をリアルにレンダリングできる、完全なエンドツーエンドのワークフロー(DCC から Unity まで)が実現しています。このワークフローは、あらゆるプラットフォーム、あらゆるライティング条件へとスケールします。このソリューションはすぐに使えるベイク済みマップのライブラリも備え、誰でも簡単に煙のエフェクトのビジュアルを一味違ったものにできるように設計されています。

6 ウェイライティング

An explosion using 6-way lightmaps under different lighting conditions

ゲームにおける煙のレンダリングは、テクスチャ付きのスプライトで行われることがほとんどですが、これは完全なボリュメトリックライティングの計算がリアルタイムな予算に対して高すぎるためです。しかし、スプライトに関して最もよくある質問の 1 つに、平坦な 2D ジオメトリをベースにした煙のライティングはどうすればいいのかというものがあります。

法線マッピングやカラーマップを完全にベイクするなど、いくつかのアプローチが存在します。しかし、これらのアプローチは、リアルさと拡張性のいずれか、あるいは両方に欠けています。

この問題を解決するための別のアプローチとして、6 方向から来る光に対する煙のライティングに対する反応を含めたライトマップのセットを使用する 6 ウェイライティングが登場しました。これらのライトマップは、アルファチャンネルとオプションのエミッシブマスクとともに、2 枚のテクスチャのセットにベイクされます。

 Depiction of six-way lightmaps
6 ウェイライトマップの図解

これらのテクスチャを搭載することで、さまざまなライティング条件下で煙にダイナミックな陰影をつけることができます。他の技術では実現できなかった、背面から光を当てたときの内部シャドウやライトリムなど、ボリュメトリックライティングを表現することができます。

 A single six-way lightmap with different sun orientations
太陽の向きが異なる 1 枚の 6 ウェイライトマップ

カラー、吸収、発光グラデーション、ライトマップの再マッピングなど、同じテクスチャをベースにさまざまな効果を作り出すためのコントロールが用意されています。これにより、さまざまなシナリオでアセットを再利用することが可能になります。

6 ウェイライティング、6 ポイントライティング、6D ライトマップ、6 ポイントライトマップ、スモークライティングなど、さまざまな名前で知られるこのテクニックは、数多くの AAA ゲームで使用されています。実際のゲーム制作において VFX 技術ディレクターとして活躍した人物が書いたこの技術の素晴らしいガイドをぜひチェックしてください。

この技術を採用する主なメリットは以下の通りです。

  • シミュレーションからライトマップに直接ベイクできるため、マルチバウンススキャッタリングなど、リアルタイムでは不可能な複雑な光の相互作用のレンダリングを可能にします。
  • より良いライティングにより、煙のエフェクトがより自然に世界になじみ、ビジュアルクオリティの向上が見込めます。例えば、シーンに追加すると、煙は間接ライティング(プローブなど)や環境ライティングだけでなく、数と種類に関わりなく動的ライティング(ディレクショナル、ポイント、エリアなど)に反応するようになりました。そのため、同じアセットを異なる場所に配置しても、それぞれのインスタンスが置かれた場所に近い環境に組み込まれているように感じられるのです。
  • 高いビジュアルの品質を実現しつつ、低いオーバーヘッドを実現できます。煙のエフェクトは、従来のライティング付きスプライトに匹敵するほど、実はレンダリングにかかる費用対効果が高いのです。
  • ディスク容量とテクスチャメモリが節約できます。フリップブックのテクスチャはどうしてもメモリが多くなってしまいますが、6 ウェイライティングを使えば、同じテクスチャをいろいろな場所で再利用することができます。煙は、ベースとしている煙のアセット、およびカラーや吸収などの違いで付けられたそのバリエーション、および煙が置かれた場所のライティング条件によって、見え方が大きく変わります。よりメモリを節約するには、ベイク済みのモーションベクトルを活用して必要なフレーム数を減らすことができます(これを行う上で、Unity Asset Store で提供されている Tuatara の TFlow が役立ちます)。
Six-way lighting used for all smokes and near clouds with many instances of only four VFX graph assets
すべての煙と近い場所にある雲に 6 ウェイライティングを使用し、たった 4 つの Visual Effect Graph のアセットで多くのインスタンスを作成している。

このテクニックについて注意すべきは、平坦に見えてしまう点です。もしこのテクニックがリアル感の高いライティングによってボリューム感のある印象を与えるとしても、見せているのはあくまでテクスチャシートであり、3D のボリュメトリックエフェクトではないのです。そのため、背景のエフェクトやスチームや爆発などの装飾的なエフェクトに使うのが最適です。より深みを出すには、このエフェクトをより多くのパーティクルに使用するか、ボリュメトリックエフェクト(例えば、ローカルボリュームフォグや HD レンダーパイプラインのボリュメトリックなマテリアル)と組み合わせる必要があります。

ここでは、代表的な使用例を紹介します。

  • 日中のシーン:太陽と空の光が煙の中を伝搬する様子のシミュレーション
  • 夜のシーン:静的なポイントライトまたは動くポイントライト、およびスポットライトで煙を照らすことができる
  • リアル感のある煙
  • スチーム
  • ボリュメトリッククラウド:沸き起こる雲を表現する 6 ウェイライティング
  • ポータル、砂嵐、竜巻などの高度なエフェクト。
6 ウェイライトマップを複数使用した高度なポータルエフェクト

6 ウェイライティングマップの構築とプロセス

エクスポーター

ライトマップの生成プロセスを支援するツールをいくつか提供しています。VFXToolbox リポジトリには、Houdini と Blender 用のエクスポーター、および 6 ウェイライトマップのフリップブックの再パッケージ化や色の強度の調整に使用できる Image Sequencer のような他のツールも含まれています。

SideFX Houdini 用の HDA ファイル

このコンテンツはサードパーティのプロバイダーによってホストされており、Targeting Cookiesを使用することに同意しない限り動画の視聴が許可されません。これらのプロバイダーの動画の視聴を希望する場合は、Targeting Cookiesのクッキーの設定をオンにしてください。

Unity の Visual Effect Graph に対応した Houdini の 6 ウェイライトマップエクスポーターを紹介します。

ツールのインストールに関するすべての説明は、Readme.txt に記載されています。なお、このツールには 2 つのバリエーションがあります。1 つ目は Object コンテキストにあります。OpenGL のレンダーノードをベースにしており、非常に高速です。

2 つ目のバリエーションは、Stage コンテキストにあり、Karma レンダラーを核として構築されています。どちらもライトマップ、エミッシブ、およびフリップブックのエクスポートのレンダリング機能を備えています。

Blender 用アドオン

Blender exporter collapsed menu
Blender エクスポーターの折りたたみメニュー

アドオンをインストールするには、Blender の標準的な手順に従います。Preferences メニューから、unity_6way.py をインストールし、アドオンを有効にします。その後、3D ビューの Unity カテゴリにパネルが表示されます。

このアドオンでは、ライトマップのレンダリング、エミッシブチャネルのレンダリング、基本的なコンポジションの実行のほか、ライトマップのシーケンスからフリップブックを作成することが可能です。これらの作業は一度に行うことも、別々に行うこともでき、それぞれの段階で個別の設定を行い、最終的な結果をコントロールすることができます。

Blender exporter stages settings
Blender エクスポーターのステージ設定

その他のツール

EmberGen sample setup
EmberGen のサンプルセットアップ

ツールによっては、6 ウェイライトマップをエクスポートするための公式またはユーザーが作成したオプションやプラグインがすでに提供されている場合があります。

例えば、EmberGen では、Render ノードで「Six point」というオプションを使用することができます。なお、このワークフローは公式にはサポートされていません。なぜなら、これらのマップの光の強さをコントロールすることができないからです。しかし、手動で調整すれば十分使える場合もあります。

また、お手持ちのツールを使って 6 ウェイライティングマップを構築することも可能です。そのためには、以下に説明する手順に従い、フォーマットパッキングを行います。

ライトマップのベイク

ライトマップをベイクするために、異なるライティング設定でオブジェクトを 6 回レンダリングする必要があります。

レンダリングごとに、カメラに対して上下左右、前後と方向を変えた白色のディレクショナルライトを使っています。

火などのエミッシブの情報はライトマップの一部ではないので、後で別のテクスチャでレンダリングするか、ライトマップの追加のチャンネル内にパッキングすることができます。

ライトマップテクスチャのフォーマット

6 ウェイライティングマップのデータは、2 枚の RGBA テクスチャに収められます。6 つのライトマップの方向は、2 枚のテクスチャのカラーチャンネル(赤、緑、青)にそれぞれ格納されています。

さらに、1 枚目のテクスチャのアルファチャンネルは、透明度を含んでいます。これにより、2 枚目のテクスチャのアルファチャンネルを追加チャンネルとして利用できるようになります。現在のワークフローでは、その追加チャンネルにエミッシブの部分を詰め込むという選択肢を取れます。

Lightmap A: Right, Top and Back lightmaps + Transparency
ライトマップ A:右・上・奥のライトマップ + 透明度
Lightmap B: Left, Bottom and Front lightmaps + Extra channel
ライトマップ B:左、下、前のライトマップ + 追加チャンネル

テクスチャを選択すると、Unity エディターのプレビューウィンドウで、チャンネルを個別に調べることができます。

他のツールで作成されたライトマップは、これらのチャンネルを異なる順序でパックすることができます。Unity 内部でインスペクターを使ってチャンネルを並べ替える基本的な機能はありますが、あるテクスチャから別のテクスチャにチャンネルを移動させる必要がある場合は、画像エディターが必要になる場合があります。

煙のライティングのレンダリング

Still of sample explosion at night
夜のシーンでの爆発サンプルのスチル

煙のライティングは HDRP のライトループに直接組み込まれているため、煙に影響を与えるライトの数に特定の制限はありません。もちろん、ライトの数が増えれば増えるほど、計算量は増えていきます(ライトレイヤーを活用すれば、これを軽減することができます)。

ディレクショナルライト、ポイントライト、スポットライト、矩形ライト、リニアライトなど、あらゆるタイプの直接光を扱うことができます。また、雷、電気の火花、燃え上がる炎、ホタルなどを表現する煙のエフェクトの中のライトも非常に印象的な結果を生み出します。

Dynamic lights inside six-way smoke
6 ウェイライティングを使った煙の内部の動的なライト

各ライトについて、まずパーティクルに対する方向を決定し、この方向を使って異なるライトマップをブレンドすることが重要です。エリアライトの場合、私たちはライトの最も近い点を特定して方向を計算する Most Representative Point 方式を採用しています。

Same smoke effect under different lighting conditions – top left: directional light and ambient; top right: ambient, probe volumes and directional light; bottom left: ambient and probes; and, bottom right: spot light and probes
同じ煙のエフェクトを異なるライティング条件下に置いた場合の見え方を示す。左上:ディレクショナルライトと環境光、右上:環境光、プローブボリュームとディレクショナルライト、左下:環境光とプローブ、右下:スポットライトとプローブ

パーティクルも間接ライティングの影響を受けます。特にライトプローブ、アダプティブプローブボリューム(APV)、アンビエントプローブ、ライトプローブプロキシボリューム(LPPV)からは影響を受けやすく、シーンでどのタイプの間接ライティングが有効になっているかによって影響が変わります。速度のパフォーマンスを最高にするなら、環境光のみのモードを使い、ライトループを完全にスキップして、非常に安価なライティング計算を行うのがよいでしょう。

Adaptive Probe Volumes and six-way smoke lighting
アダプティブプローブボリュームと 6 ウェイライティングを施した煙

パフォーマンスを考慮し、プローブの寄与は頂点シェーダーで評価した後、ピクセルシェーダーに補間される。つまり、クアッドを出力とする場合、プローブはクアッドの 4 隅でのみ評価されます。APV のような空間的に変化するプローブでは、1 つまたは複数の頂点が壁の片側に、パーティクルの残りの部分が反対側に来ることがあります。この場合、プローブの寄与が正しくなくなり、見た目のアーティファクトを生じさせる原因となります。より多くの頂点を持つテッセレーションメッシュを使用することが解決策の 1 つとして挙げられます。なお、一般的に屋外のシーンでは問題ありません。

このモデルでは、煙は完全に拡散すると考えられるため、スペキュラー反射の寄与は評価されません。これは、例えば、リフレクションプローブが 6 ウェイで煙を照らしている時、パーティクルに影響を与えないことを意味します。

また、煙に色をつける方法も 2 種類用意しています。これを実現するには、ライトマップからカラー成分ごとの光の吸収を導出する方法(色つきの煙をよりリアルに動かせる)か、単純な乗算(最も安価な方法)を使用することができます。

Comparing multiply and absorption modes to apply color to smoke
煙に色をつけるための乗算モードと吸収モードの比較
Evaluation of six-way light scattering aka Bidirectional Scattering Distribution Function (BSDF)
6 ウェイの光の散乱(双方向散乱分布関数(BSDF)とも呼ばれる)の評価

Visual Effect Graph による 6 ウェイライティングのレンダリング出力は、エフェクトの見た目をカスタマイズしたり、同じライトマップを再利用して異なるエフェクトを作成するためのさまざまなコントロールを提供します。

1. カラーと吸収

Create smoke, steam, or clouds with the same lightmaps using color and absorption strength controls
カラーと吸収の強度をコントロールすることで、同じライトマップで煙、スチーム、雲を作成できる

2. ライトマップ再マッピング

Create more or less dense or stylized effects, remapping the lightmaps
ライトマップを再マッピングして、より緻密な、あるいはスタイル化されたエフェクトを作成する

3. 放出率

Transform smoke into explosions using different emissive gradients
さまざまな放出のグラデーションを用いて煙を爆発に変換する

始めよう

わずか数分で美しい 6 ウェイの煙を追加することができます。Unity 2022.2 以降で、Visual Effect Graph と HDRP を使う必要があります。

素早く試していただけるよう、すぐに使えるマップライブラリを作りました。VFX Toolbox などを使って自由に加工・パッキングできる高忠実度のアセットと、ゲーム用に軽量化されたコンパクトなバージョンの両方を提供しています。

An example of a free six-way sample that is now available
現在利用可能な無料 6 ウェイサンプルの一例

これらのマップと 6 ウェイライティングを使ったエフェクトは、以下の手順で作成します。

  • Unity の Asset フォルダーにマップをドラッグアンドドロップします。
  • 新規に VFX Graph アセットを作成し、開きます。
  • 新規に Particle Lit Output を作成し、選択します。
  • インスペクターの Material Type ドロップダウンで Six Way Smoke Lit を選択します。
Inspector view with “Six Way Smoke Lit” selected
Six Way Smoke Lit を選択した場合のインスペクタービュー
  • インポートしたマップを使用して、Output コンテキストの Positive Axes Lightmap と Negative Axes Lightmap を設定します。
  • さまざまなライティング条件でテストしてください。 

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 フォーラムスレッドにフィードバックやご質問をお寄せください。新機能の提案や検討中の機能への投票は、レンダリングの公開ロードマップで行うことができます。

フォーラムでディスカッションに参加する
関連する投稿