ゲームエフェクトデザイナーのブログ (新)

レポート記事とかUE4のマテリアルとか。C#とかも触ったり。

CEDEC2018 モンスターハンターのエフェクトエディタの講演の感想

早速、ファミ通の記事がきていましたね。早い‥!

ライブ配信では仕事しつつだったのでちらっちらっとしか見れなかったのですが、タイムシフト配信のおかげでじっくり視聴できました。タイムシフト配信は本当にありがたい!

また、非常に盛り沢山な内容で大変参考になりました。。

せっかくなので、視聴して感じたことをががっと書いてみたいと思います。
※写真撮影・SNS投稿どちらもOKとのことなので動画の一部も引用させていただいています

エディターについて


MT Framework2.0とRE Engineのエフェクトエディタのハイブリッド型だそうで、モジュールスタック型のノードベースということです。

モジュールの中身までアーティストがノードで組んだりはなさそうで、そこはプログラマさんとやり取りしつつ用意してもらう感じのように話されていますね。

f:id:moko_03_25:20180826013124j:plain

オペレーションのヒストリは無いということですが、無いなら無いで慣れてしまいますし、ヒストリーって不具合の温床みたいなイメージあるのでバッサリ切った方が良い面もあるんでしょうね(UE4のマテリアルエディタではアンドゥ機能にめちゃ助けられてもいますがっ)。実際ツール作る時に、ヒストリーに対応するの非常に大変そうな印象あります。。

個人的に開発環境ですごく必要と思っているのがアセット管理周りのサポート機能なのですが、そのあたりも色々聞いてみたい。他のモンハンの講演で話されてたりするのかな?

あとカーブエディタが見当たらないですが、どんな感じでアニメーションを設定しているのか気になります。直線補間と時間の指定で完結されていたり?

ちなみにエディタのサンプルとして取り上げられていたのは着地エフェクトで、あらゆる地形用の効果が1つのエフェクトデータにワンパックになっていて条件によって表示分けしているそうな。こういったデータはマップごとに必要最小限のデータになるような形にして読み分けるか悩みそうですが、ワンパックにしてメモリに常駐させとく方がアセット管理面でもロード面でも優しそうですね。

▼アイテムリスト

エミッターへのアイテムリストからアイテムの追加は、ドラッグ&ドロップよりダブルクリックの方が早くて自分は好みかなと思いました(選択中のエミッターへ追加される形)。でもそれ以外のアイテムはエミッター外に置くから2つの追加操作が混在する形になっちゃいますが。。

アイテムリスト上部に良く使うアイテムがランキング順で10個くらい並ぶパネルがあったらさらに快適になりそう。いや、登録できる方がいいな。いや、ショートカットキーを割り当てられる方がいい‥!など脳裏をぐるぐると。何千回と繰り返すであろう操作なので、このあたり重要ですよね。。ツールって「やりたいことができるのが一番大事」で「操作感に手を入れるのは余力があれば」がどうしても基本になってしまうものだと思うのですが、一日何時間も同じ操作をし続けることからも、新しい機能を追加してもらうよりもUI周りの快適さを上げてもらえる方が自分は遥かに嬉しかったりします。

▼トランスフォームの設定

色んなツールを見たり触ったりすると、エフェクトやエミッターやバウンディングボックスのトランスフォームは数値入力ではなくマニピュレーターでできるようにして欲しいと思うのですが、同じエフェクトアーティストなみなさまはどうでしょう?

特にキャラクターの骨にアタッチする場面(UE4だとPersona)では欲しいなって思ったりします(モーションを再生停止した状態でのみの操作で良いので)。例えば斜め斬りモーションに対して三日月型の斬撃エフェクトをぴったり合わせないといけない場合、数値入力を繰り返して丁度良い場所に位置と向きを合わせるのはツラい。。例えばレベルにアセットを配置する時に数値入力でしか指定できなかったら気が狂いそうじゃないですか?

▼F5キーで再生

F5キーで再生されるのは「ネイティブです」と話されていましたが、これはその都度コンパイルが走ってネイティブコードで動作するってことでしょうか?どういうことかしら。。

パーティクルソート


なぜエミッターの並び順だけでなく優先度設定も必要なのか今一つピンと来ませんでした。使い分けについては話されていましたが、エミッター順だけで十分そうな‥?

Actionで親子関係にしたときにエミッター順のみでは不都合で必要な感じでしょうか。

大抵のエフェクトに設定している感じで話されていましたが、人的エラーが起こりやすそうでちょっと気になりました。

しかしこうして見ると、ノードネットワークがメインになっているエディタでも優先順位の視認性とエミッター選択の快適性の理由からエミッターリストはあった方が良いだろうなと思います。

f:id:moko_03_25:20180826013215j:plain

パーティクルライティング


「テンポラルシャドウ」の実装のみならず、どうライティングされるかエフェクト側で細かく設定できることからも、本腰入れて取り組まれている様子が分かります。

モンハンの煙や水へのライティング表現はとても良い感じです!素敵です。。
タイムシフト動画では画面が盛大に発光していますが‥)

f:id:moko_03_25:20180826013230j:plain

「テンポラルシャドウ」の遷移条件で0.2秒未満での環境の変化は切り捨てるというのは良いですね!色んな場面で応用効きそうっ。

「LightFactor」は暗いシーンでも完全に溶け込まないようにするための施策でしょうか?
「ShadowFactor」は逆光時などに真っ黒にならないようにするためかしら?

プリセットで運用しているのはとてもいいですね!

エフェクトアイテムの紹介


エディタの様々な機能(UE4で言うところのモジュール)の紹介。

▼RGBcommon / RGBwater

f:id:moko_03_25:20180826013443j:plain

 「エフェクトエディタ上で簡易的にコンポジットしてシェーディングするためのアイテムです」とのことで、エフェクトエディタ側からシェーダーの値を動的にオーバーライドして、テクスチャのRGB各チャンネルを混ぜ合わるアニメーションも設定できるようです。

UE4で言えば、4つのScalar Parameterに限定されるもののDynamic Parameterで同様のことが可能です(Particle Colorも合わせると8つのScalar Parameterとも言えますね)。

エディタ上からテクスチャも差し替えたりできるのかは聞いてみたいところ。。UE4でこれが可能だと管理しないといけないマテリアルインスタンスが大幅に減るんですよね。。

▼RGBテクスチャ

煙の例が挙げられて、以下のような成分を格納していると説明されていました。
 R ライティングされた煙
 G 炎
 B 薄い煙
 A アルファマスク

f:id:moko_03_25:20180826013642j:plain

4チャンネルフルで使っていることからもBC7でしょうか。
(RGBだけならDXT1/BC1の方がBC7より半分のデータ量になるので)
ただ、BC7でRGBAフルで使うとノイズがひどいことがありますが‥このあたりってみなさんどう回避されてるんでしょう。。

雨は専用として法線をRGに格納したそうですが、それ以外は法線マップやキューブマップはほぼ使用していないとのこと。リアルな煙で法線マップをうまく活用しているタイトル事例があれば知りたいです。

雨のテクスチャ、なかなかに高解像度ですね。カメラに大きく写ることがあるからでしょうか。マルチプレイ前提なのでスローモーション対策ではないですよね。

f:id:moko_03_25:20180826013825j:plain

ちなみに炎と煙のテクスチャはMayaFluid、爆炎はMayaのFumeFXを使用しているということです。水や破片はHoudiniとのこと。

ゲームでビルボードの流体系テクスチャを最終的に良い見た目に落とし込むというのは実際かなり難度が高いと思っていて、同じ絵柄を複数枚重ねてもパターンに見えないようにしないといけないし、出始めから消え際まで美しいフォルムにするにはかなりの加工が必要という認識です。これを何らかの別の形でフォローして、なるべくレンダリングまでで工程を完結できるようになれば。。

▼Type Lightning(プロシージャルな雷)

モンハンワールドは雷もとても良い感じで、キリンの帯電などセルアニメのようなメリハリのある強弱が付いているのでとてもカッコ良い!です。

それは講演でも話されていましたが、プロシージャルなラインと高精細なテクスチャの合わせ技だからこそでしょうね。。

また、シビレ罠も罠からモンスターの身体の方向へ流れる感じになっていて、プロシージャルならではな使い方がされていると思いました。

ビルボードと比べて良い点はやっぱり3D空間上で自由なラインを描くところですよね!

ちなみにプロシージャルでの形状は「コッホ曲線」を参考にしたそうな。

山中さんの情報とDFさんの記事に感謝‥!

モンハンワールドの雷で若干残念に感じたのは、輝度が高すぎるため描画面積が大きい部分のグローがでかくダマのようになっていて、逆に細いラインではぶつ切りになるところでしょうか。。このあたりはポスプロのグローの仕様上仕方ないのかも知れないですが、良い回避策は無いものかと思ったりします。

▼PL Emissive

これはUE4で言えばキャラのマテリアルにParticle ColorノードをEmissiveの値に乗算するよう仕込んでもらって、キャラにParticle Systemを何らかの形で紐付けてエミッターのColorモジュールでエミッシブカラーのアニメーションを制御するようなイメージですね。

f:id:moko_03_25:20180826014729j:plain

必殺技のエフェクト演出とキャラのシェーダー制御を綺麗にマッチさせたいと思うと、やはりモンハンワールドの事例のようにエフェクト側からの制御が適していると思います。回復効果と必殺技を発動したタイミングが被った時なんかのためには、優先度設定だったりどうミックスされるかの設定が必要だったりもしますが、そのあたりも言及されていますね。やっぱり基本こういうのは後書き優先ですよね。後のPL Emissiveが寿命が短くて先のPL Emissiveの寿命がまだ残っていた場合は、遷移で戻すことはさせない感じでしょうかね。遷移時間は後書き側の寿命をみて決めているというのはなるほど!

▼Noise

GPUパーティクルの動きに対してのノイズは、Sin計算2重掛けした簡素なノイズということです。なるほど!

▼Blink

f:id:moko_03_25:20180826014843j:plain

UE4で言えば、パーティクルの明滅はマテリアルでも可能(頂点のスケールでもテクスチャのUVスケールでも不透明度のスケールでも)ですが、アニメーションカーブを手作業で付けた時のメリハリの効いた表情をできるだけカバーするよう構成してパラメータ出しを頑張るのか割り切るかは悩みどころかなと。。

ただ、明滅させるためにカーブエディタで大量にキーを打って手動で設定するのは限界来てるかなと思うので、よく利用するカーブデータの形をプリセット化してプルダウンですぐ設定できるようなUIにできれば良いなというのはよく思います。

▼RayCast

RayCastそのものの説明も非常に面白いのですが、何よりも事例で挙がっている爆発がめちゃ良いんですよね。。

f:id:moko_03_25:20180826015110j:plain

エディタのプロパティで背景を判定するチェック項目名が「SCR(恐らくスクロール?)」となっているのが方言が出ていてニヤリとしました。。

レイキャストとともにパーティクルの発生範囲を伸ばしていくというのはなるほどなあと。。

f:id:moko_03_25:20180826015145j:plain

▼Action

エミッターの親子関係など。

f:id:moko_03_25:20180826015239j:plain

モンハンワールドは、最終的な絵が非常に良い見た目に仕上がっているのがとにかく素晴らしいと思うのですが、ここで紹介している竜巻で舞い上がる破片のうねる動きもまた、めちゃいいですね!

親子で3つの回転構造になっているようです。竜巻の周囲を回るのでY軸回転は必要として、うねるのに2つの回転を掛け合わせてるってことでしょうね。

f:id:moko_03_25:20180826015257j:plain

衝突先の属性によって出すエフェクトをエフェクトデータ側でフィルタできるのも良いですね。冒頭の着地エフェクト然り、こういうことはNiagaraだとやりやすそう。

あと「インスタンス群のソートに関しては親パーティクルの座標単位で深度を取ることが出来る別機能で制御」とありますが、これは非常に重要な機能で、エフェクトは半透明のパーティクルばかりで作るため基本的にエミッター単位で描画順が決まらざるを得ないですが、すると複数のエミッターがある程度の範囲にアルファブレンドのパーティクルを重ねて出すと見た目がおかしくなりますが、これを回避できるということですね。

f:id:moko_03_25:20180826021008j:plain

▼Extern

プログラム制御の場合の実装コストにも言及されていますが、UE4だとマテリアルのパラメータを動的に遷移させる場合や、cascadeのDistoribution Type>Particle Parameterを利用して外部から制御できるようにする際など、0~1の値の制御で済むようにするのは大事ですよね。。

炎が鎮火していくのをExternで制御したということですが、寿命に合わせて輝度や発生量を抑えていったりするのであればカラーや発生数のアニメーションで十分な気がするのですが、ゲーム実行しつつ外部から値を変えて調整しやすくするためにExternでやったとか、そういう感じなんでしょうか?

もしくは普段アニメーションが設定できる項目(アイテム)がかなり絞られているのかな?

f:id:moko_03_25:20180826021826j:plain

▼TubeLight

Tube Lightのところで話されていましたが、ディストーションパスは半透明パスより後ということです。破綻は問題にならなかった感じでしょうか。

描画面で余裕があるなら、半透明をフォワードで描いていく途中でもディストーションを入れられると良さそうと思ったりはします。ディストーションを複数回描画するコストと、半透明を専用バッファに描いて最後に合成している場合は、途中で合成するコストも上乗せになりそうですが。。

▼FadeByEmitterAngle

パーティクルを範囲で発生させる際に、カメラから見たY軸の角度に応じてパーティクルをフェードアウトさせ、アルファが0になったら頂点にnan座標を代入して描画せずに済むようにするそうな(スケール0にするよりも処理が軽いんでしょかね?)。

追記:
こちらについて梶井さん(@nqg54549)からフォローいただきました!
さすがお詳しい‥!ありがとうございます‥!

先ほど書いたように範囲でパーティクルを出すエミッターがあると、エミッター同士のソートで見た目が破綻するので、こちらもその回避になりますね!

あと何よりも近付くと復活するのが素敵!

f:id:moko_03_25:20180826022933j:plain

ソロプレイのゲームを作っている場合はどちらかと言えば「リング状にパーティクルを発生させる際に手前半分からだけ発生させる」というのは思い付く訳ですが、発生源の中心にカメラが近付いた時には「なんもない」となって問題になりますね。。

また、マルチプレイだとプレイヤーの視点が複数あるのでとりあえず全方位分発生させないといけないですよね。これはとても良いアイデアですね。。

離れていて見下ろし視点の場合に見た目が不自然かもですが、実際には真ん中にでっかいモンスターがいるでしょうから、大丈夫そうですね。

ちなみにカメラに非常に近いパーティクルもアルファ0にして二段構えのカリングをしているとのこと。

サンプルエフェクトの紹介とその構成について


なんというか、本当に盛りだくさんですね!すごい。。

テオ・テスカトルの纏いエフェクト

タイムシフトの動画だとよく分かりませんが、ビジュアルがとても良いです。。

f:id:moko_03_25:20180826025734j:plain

▼ゼノ・ジーヴァのブレス

レーザーのRayCastとコリジョンのサイズが同期してるというのも良いですね。
あとライトは特にキャラを照らしている点で効果高い気がします。

f:id:moko_03_25:20180826025855j:plain

ナナ・テスカトリのヘルフレ

広範囲をカバーするエフェクトは頭を悩ませますよね。。
特に、どの距離にカメラがあっていても良い見栄えにするのが‥

f:id:moko_03_25:20180826030501j:plain

デカールは50個出してるそうですがRayCastでちゃんとやってるとのこと。重そう。。
継続したスパイクは回避できなかったということで、ですよね‥と少しホっとするなど。。

しかし、せっかくデカールなのだからRayCastなしでも良かったのではと思いましたが、どうなんでしょう。RayCast先の地面の法線に応じて火の粉エミッターの角度を合わせるためでしょうか。

f:id:moko_03_25:20180826031117j:plain

という感じで、参考になるお話が山ほど聞けてお腹一杯になりました!

竹井さんに感謝です‥!