Unity Pro Tips

オフィシャル記事詳細

美しい VFX をリアルタイムで制作

<このページで学べる内容>

Unity で炎、煙、ホログラムなどの映画のようなエフェクトを実現することに興味をお持ちですか?Unity の Visual Effect Graph のノードベースのワークフローエフェクトと適応性のある機能を使用して、美しい VFX をリアルタイムで作成する方法について説明します。この記事は、Unity のリードグラフィックステストエンジニアである Vlad Neykov が進行役を務めた Unite Copenhagen 2019 のセッションをベースとしています。  Unity では、Visual Effect Graph の検証済みの機能とワークフローをすべて網羅したブログ記事を最近公開しました。Visual Effect Graph のアーキテクチャに関するヒントや、VFX を Magic Book のデモにどのように活用したかについて詳細をお確かめください。

Visual Effect Graph の概要

Visual Effect Graph は、Unity の次世代のビジュアルエフェクトツールです。シンプルなものから複雑なシミュレーションまで幅広く、あらゆるものの制作に使用できます。

各ビジュアルエフェクトは Project フォルダーに自己完結型のアセットとして置かれます。イベントやパラメーターのインターフェースがあり、Unity の残りの部分と通信できます。Visual Effect Graph は HD レンダーパイプライン(HDRP)と連動するよう設計されており、(コンピュートシェーダーをサポートする)次世代のプラットフォームに合わせて調整されています。 

Visual Effect Graph は GPU 上でシミュレートされることで、はるかに多くのパーティクルに対応できます。ノードベースのアプローチにより、ユーザーはカスタム動作や複雑なシミュレーションを作成できるようになるほか、フレームバッファーへのアクセスにより、シーンジオメトリの上に重ねてパーティクルをスポーンするなどの強力な機能を使用できます。

ただし、GPU 上でシミュレートされるということは、CPU とのデータ送信のやり取りがささいなものではなくなるということを意味します。Visual Effect Graph は C# での VFX パーティクルデータの読み取りに対応しておらず、Unity の Physics システムと対話しないため、物理演算ベースのエフェクトを制作するには何らかの代替策を導入する必要があります。

Visual Effect Graph のフロー

システムを作成するときは、一連のコンテキストノード(コンテキスト)が垂直方向に接続され、上から下の順に実行されます。これらはあらゆるエフェクトのビルディングブロックです。

Spawn は、現在のフレームで作成すべきパーティクルの数を決定するコンテキストです。次のコンテキストである Initialize は、そのエフェクトの容量とバウンディングボックスを決定するほか、そのパーティクルの初期値が指定される場所になります。組み込みのパーティクルシステム内とは異なり、バウンディングボックスは動的ではないため、エフェクトが正しく呼び出されるにはボックスがそのエフェクト全体を囲んでいることを確認する必要があります。 

Update はすべてのフレームを実行するほか、衝突のシミュレーション、異なるノイズ乱流の追加などを実行するのに適した場所です。Output は、パーティクルをどのようにレンダリングするかを決定し、各システムは複数の出力に対応できます。また、大量のパーティクル属性をレンダリングする前に Output で調整することもできます。グラフ全体を通してサイズを変更する必要がない場合は、それを単に最後に設定すればよいため、そのためにバッファーを予約する必要はありません。

Visual Effect Graph のアーキテクチャ

Visual Effect Graph は Project フォルダー内のアセットで、サブアセットとして格納されたスクリプタブルオブジェクトとしてブロックやノードが含まれます。Visual Effect Graph から、Unity は Visual Effect Graph の下位レベルである表現グラフを生成します。その後、表現グラフはこの情報を VFX コンパイラーに送信し、そこで大量のランタイムデータが生成されます。 

このデータには、シミュレーション用にコンピュートシェーダー、パーティクルのレンダリング用に頂点シェーダーとピクセルシェーダーのペアが含まれます。また、CPU インタープリター用にバイトコードを生成します。CPU でフレームごとに 1 回計算するほうが、GPU でパーティクルごとに 1 回計算するよりも効率的であるためです。 

また、VFX コンパイラーは、各システムが実際に必要なデータのみを格納するように、パーティクルデータレイアウトを生成します。たとえば、システム内で加速度を使用していない場合、Unity は加速度用にパーティクルごとに別の Vector3 を格納しません。各システムは関連するものだけを認識するよう最適化されます。シンプルなエフェクトを作成する必要がある場合、より大きなエフェクトで必要とされる可能性があるすべての属性は持ちません。 

また、コンパイラーはプロパティシートを作成します。ここに公開されたすべてのパラメーターが見つかります。Visual Effect Graph の要素は Timeline またはコードを通じてアクセスするか、インスペクターで直接変更できます。 

最後に、コンパイラーにすべての VFX システムの一覧が表示されます。これにより、それぞれに対して異なる呼び出しを発行できます。

コンパイル機能

エフェクトの編集中、自動コンパイルを使用すると、Visual Effect Graph を再生モードででも常に変更できるので便利です。値を変更して再コンパイルすることなくエフェクトの結果を確認できるほか、ブロックやノードを接続または接続解除することでグラフを変更すると、再コンパイルがトリガーされます。

Visual Effect Graph の新機能

次の数多くの新機能が Visual Effect Graph に追加されています。 

  • サブグラフ
  • VFX シェーダーグラフ(プレビュー)
  • パーティクルストリップ(プレビュー)
  • 内部シーケンシング(ループと遅延) 
  • モーションベクターのサポート

サブグラフを使用すると、要素を再利用できるようになるほか、プロジェクトを整理するのに便利であるため、より規模の大きなプロジェクトのビジュアルエフェクトで不可欠です。サブグラフは、コンテキストメニューで目的のノード/ブロックを選択するか、プロジェクトウィンドウで直接作成できます。 

Visual Effect Graph にシェーダーグラフの統合を追加しました。これにより、シェーダーグラフのシェーダーを作成し、ブラックボードを介してパラメーターを公開して、それらを Visual Effect Graph 内で直接使用することで、VFX の出力ごとにレンダリング動作をカスタマイズできます。

モーションベクターのサポートは、火花などの高速で動くパーティクルを作成するのに特に便利です。モーションブラーポストプロセッシングエフェクトと一体となって機能し、目的の出力のボックスをオンにするだけでアクティベートできます。 

Visual Effect Graph に新しく追加された実験的および製品版の機能の詳細と、それらをご自身のプロジェクトで使用する方法については、Unity の最新のブログ記事を参照してください。

デモの時間:マジックブックエフェクト

マジックブックの動作

Unite Copenhagen のセッションのデモでは、マジックブックエフェクトを紹介しています。これは VFX のサンプルプロジェクトに含まれており、最近追加された機能を使用しています。

VFX のオペレーターとブロック

VFX シェーダーグラフの統合と、トレイルを作成するパーティクルストリップのデータ型は、まだ実験段階です。それらを使用するには、「Preferences」 > 「Visual Effects」 > 「Experimental Operators/Blocks」内で、実験段階の機能を有効にする必要があります。

ページが燃えているエフェクト

マジックブックのページではカスタムアルファ浸食エフェクトにシェーダーグラフのシェーダーが使用されており、Visual Effect Graph の Lit Mesh Output に割り当てられています。シェーダーグラフのシェーダー内の公開済みのプロパティは Visual Effect Graph で利用可能で、意のままに変更できます。

サブグラフ

利用できるもう 1 つの優れた機能は、サブグラフの追加です。サブグラフには、新しいカスタムオペレーター、ブロック、動作を作成できる機能のほか、再利用可能な機能やエフェクトのライブラリを構築できる強力な手段が備わっています。次の 3 つの種類のサブグラフがあります。

  • サブグラフオペレーター
  • サブグラフブロック
  • サブグラフエフェクト

サブグラフオペレーター

サブグラフオペレーターは、別個のオペレーターをリンクすることで作成されます。これに該当するマジックブックエフェクト内の一例として、ランダム Vector3 を作成するオペレーターが挙げられます。このサブグラフは検索可能で、見た目は普通のオペレーターとして他のあらゆるグラフに追加できます。

サブグラフブロック

サブグラフブロックは、ブロック(さらにオプションでオペレーター)を使用して作成されます。これに該当するマジックブックエフェクト内の一例として、ページのパーティクルを初期化するために必要ないくつかの要素を組み合わせるシンプルなブロックが挙げられます。上の画像に示すようなブロックのサブグラフは、普通のブロックとして使用できます。

サブグラフエフェクト

サブグラフエフェクトは、さまざまなエフェクトを同じグラフ内にネストするのに便利です。これは、グラフをシンプルにするのに役立つほか、同じ Visual Effect Graph ウィンドウ内の複数のエフェクトを制御できます。宙に浮かぶ岩の VFX には、岩自体の Output Mesh、チェーンの VFX の 2 つのインスタンス、岩を揺らすのに合わせて 2 つのチェーンを一斉に動かすシンプルなシミュレーションが含まれます。

スポナーの機能

新しく追加されたもう 1 つの機能は、ループの継続時間やループの回数を制御したり、各ループの周囲に遅延を追加したりする追加のスポナー機能です。より複雑なスポーン動作を作成するのに便利で、ここに示すヤコブの梯子エフェクトでスポーンのバーストを制御するのに使用されます。

パーティクルストリップ

ビームの周囲を飛び交うトレイルには、パーティクルストリップが使用されています。Initialize コンテキスト内で設定できる新しいデータ型です。パーティクルストリップは専用のパーティカルストリップの出力を使用し、各ストリップ内のすべてのパーティクルを接続してシームレスなトレイルに仕上げます。 

このパーティクルエフェクトでは、1 つのシステムがトレイルの頭に使用され、GPU イベントをトリガーしてその背後のトレイルセグメントを作成します。また、パーティクルストリップは改良中であるため、使用するには「Preferences」 > 「Visual Effects」 > 「Experimental Operators/Blocks」で、実験段階のオペレーター/ブロックのオプションを有効にする必要があります。

モーションベクター

高速で動くいくつかのパーティクルでモーションベクターの生成を有効にすることで、エフェクトに最終的な仕上げを追加しています。このオプションは、必要な VFX の Output を選択し、「Generate Motion Vector」チェックボックスをオンにした後に、インスペクターで有効にできます。これがモーションブラーポストプロセッシングエフェクトと連動することで、高速で動くパーティクルを移動している方向に完全にぼかすことができます。

ポーションの泡とスモークのエフェクトの作成

ここまでで取り上げていないエフェクトとして、ポーションの泡とスモークのエフェクトの 2 つが残っています。 

泡の衝突には符号付き距離場(SDF)が使用されており、ポーショングラスのメッシュを使用して Houdini に完全にベイクされます。泡は、両方ともそれに引き付けられる(「Conform to Signed Distance Field」ブロックを使用)ほか、衝突もします(「Collide with Signed Distance Field」ブロックを使用)。

スモークには類似のアプローチが使用されていますが、衝突については球体や円柱などのプリミティブな形状を使用してポーションのおおよその形状にすることで適用しています。

Visual Effect Graph についての詳細情報はどこで入手できますか?

Visual Effect Graph の詳細については、Visual Effects Graph のページVFX のサンプルプロジェクト、Unity のブログ記事を読み、フォーラムのディスカッションにご参加ください。 

この記事はいかがでしたか?