2008年の設立以来、「"Entertainment in Real life" エンターテインメントで日常をより楽しく、より素晴らしく」をMissionに掲げ、新しい発想のモバイルゲームを世に送り出し続けているコロプラ。
同社は2021年からUnityのレンダリングパイプラインをUniversal Render Pipeline(URP)へ本格移行し、デモアプリの開発を通して様々な表現のR&Dを続けてきた。そして去る1月24日(火)、そのデモアプリが、短篇アドベンチャーゲーム『PRINCIPLES』として配信開始された。
CGWORLD.jpでは、「モバイルゲームグラフィックス最前線」と題して、背景やVFXの技術的な取り組みについて複数回にわたって紹介してきた。第5回となる今回は、『PRINCIPLES』リリース後の新プロジェクトについて。新たな挑戦となる、Houdiniによるプロシージャルな樹木の配置と、Adaptive Probe Volumesによるライティングについて、たっぷりと話を聞いた。
関連記事
・ボリューメトリックフォグも、シャドウもブルームもあきらめない。コロプラにUnity URP移行の今を聞く
・「HDRPの表現をURPでも可能にする」URPへの移行を実現したコロプラの次の挑戦とは?
・技術開発を自己満足で終わらせない。コロプラ技術デモにおけるVFX表現の取り組み
・新作アプリ体験会で感じた、コロプラの次世代のモバイルゲームグラフィックス開発への意欲
・コロプラの技術的挑戦が結実! 『PRINCIPLES』リリースから改めてふり返る、開発中の課題とその解決方法
Recruiting Information
コロプラでは3Dアーティストを募集しています。当社はこれまで常に最新のテクノロジーと独創的なアイデアで、人々が見たことのない"新しい体験"を届けることに挑戦してきました。"新しい体験"を私たちと一緒にゼロから創りだしていただける3Dアーティストの方のご応募をお待ちしております。
『PRINCIPLES』ではできなかったことを思いきりやる
大下岳志氏(以下、大下):皆さま、第5回もよろしくお願いいたします。今回も進行役を務めさせていただきます大下です。今回はまず『PRINCIPLES』リリース後のお話から伺わせてください。
菅原祐介氏(以下、菅原):そうですね、社内でふり返った際に、キャラクターのつくり込み、空の表現、時間変化などまだまだやれるよねという話が出ました。一方で、ある程度リッチな背景のビジュアル表現は実現できたと自己評価しています。
そこで次は、そのビジュアル表現をさらに効率化・自動化して、より広いフィールドにするにはどうすべきかというところに関心が移りました。
大下:確かに、『PRINCIPLES』はボリュームやつくり込みはしっかりしていましたが、フィールドは限定されていました。
桐山明人氏(以下、桐山):そうですね。期限を設けてアプリとしてリリースする関係上、広かったフィールドを泣く泣く切った部分もありました。その後も、CEDECの講演でも発表しましたが、技術的なアイデアはいろいろと出ていて、試せる場がほしいと。
なので今回は「前回できなかったことをむしろ思いきりやってやろう」ということで、「当初の計画よりももっと広い空間に、もっとたくさんのオブジェクトを載せたとき何が起こるのか」を検証することになりました。これが今回の大きなテーマですね。
菅原:アートとしては、『PRINCIPLES』は洞窟の中で無機質な空間でしたから、今回は方向性をガラッと変えて、木々が鬱蒼と茂る森のイメージにしました。そこから、大量に植生を配置するというチャレンジが生まれたんです。
大下:一度リリースできる状態までつくったからこそ、リアリティをもって取り組める次の課題が生まれたのですね。
桐山:その通りです。つくり込んだものを動く状態までもっていかないと、マップの広さや技術の詰め込み具合、スケジュール感などは想像しにくいですね。
菅原:そうして動き出したわけですが、まず前提としてわれわれは「モバイルのグラフィックスでナンバーワンを目指す立場」。ですから、モバイルで動かすためにコンセプトの切り分けを行いました。
具体的には、広大なフィールドを「森林エリア」と「尾根エリア」のふたつに分けました。森林エリアは近景の植生の品質、“鬱蒼感”を重視します。尾根エリアは丘が中心で、下草が大量に生えた草原のような場所です。それはいわば“質より量”で、大量の草を配置して、かき分けて進む気持ち良さを表現することになりました。
大下:どちらもスケーラビリティをもった地形のつくり方ではありつつも、近景で目隠しがたくさんあるタイプと、視界が広いタイプに分けた、と。
菅原:はい。それぞれの技術的な工夫のポイントを絞り、森林エリアではハイポリゴンの植生を大量配置して表示するのは厳しいのでどうするか、尾根エリアでは見晴らしが良くごまかしは利かないのでどうするのか、となりました。
地形を考慮して植生をプロシージャルに制御
大下:コンセプトが決まり、牛久さんが制作を進められたのですね。
牛久:はい。まず、UnityのTerrainで地形を作成しその地形のハイトマップをHoudiniにインポートしました。配置している木々はUnityのSpeedTreeで作成し、これらをマップ上に配置していくためにHoudiniで配置を自動化させています。植物の種類ごとにHoudiniでマスクを生成させて細かくコントロールしています。
配置している木々は基本的にUnityのSpeedTreeで生成したアセットです。それらに対してHoudiniでルールを付けて配置しています。
大下:なるほど。配置そのものはHoudiniで。
牛久:そうですね。ただ、Houdiniによる配置は簡単ですが、デザイナーの意図する画づくりにするためには様々な処理が必要です。まず、急傾斜の斜面や一定以上の標高の場所には植物を配置したくないため、Houdiniのノード内で斜面の角度と高さを指定してマスクを生成します。
道沿いにも木々を配置したくないので、UnityのPaint Textureで描いた道沿いの情報を画像としてエクスポートし、Houdiniにマスクとして読み込みます。遠景部分や死角となる部分には植生を配置する必要がないため、Houdiniのペイントノードでマスクを生成します。
これらのマスクを反転させることで、植物を配置するためのマスクとして使用しました。
牛久:普通に配置すると乱雑でバランスが悪いため、マスクに微調整を加えました。植物の特性を考慮し、密度を調整して粗密のバランスを整え、高木の周りに低木、その周りに草木を配置しました。
これらの植物の配置情報は、ポイントアトリビュートをHoudini Engine SessionSyncでUnityに転送し、アセットを配置しました。このポイントアトリビュートには、座標、スケール、傾き、アセットのパスが含まれています。
大下:なるほど。プロシージャルは全てHoudiniで担当して、最終的な配置はHoudini Engine SessionSyncを使ってUnity上に配置していくと。すごくわかりやすいワークフローですね。画づくりの面ではどういった工夫をされましたか?
牛久:鬱蒼とした森の中をキャラクターが歩く場合、どうしても導線を見失いやすいという課題がありました。そこで、樹木のアセットは背丈ちがいを何種類か用意して、Houdiniで配置する際に、高い樹木の周りには中くらいの樹木を、中くらいの背丈の樹木の周りには小さい樹木をと、山道に向かってスロープ状の段差ができるように、ポイントを散布してその位置に植物を配置する処理を行いました。
菅原:Houdiniで配置しているおかげで、イテレーションを速く回せました。Houdiniを導入したメリットを感じています。
牛久:初期段階では、デザイナーの意図した配置にするためのマスクを生成するルールに基づくプロシージャルなしくみの作成に時間がかかりました。しかし、一度プロシージャルなしくみが完成すると、新しい地形が来てもすぐに対応できるようになり、生産性とビジュアルの両方が向上しました。
大下:まさにルールベースの利点ですよね。
牛久:そうですね。ただ、もうひとつ課題がありました。ギミックがある箇所やカットシーンなどの見せ場では、Houdiniでの自動配置だけでは不十分なため、自動配置後に手動で修正が必要な場面があります。しかし、その場合、自動配置すると手動で修正した部分が崩れてしまいます。
桐山:その解決策をエンジニアも一緒に模索しまして、簡単なUnityのEditor拡張をつくって対応しました。Houdiniで散布したデータがUnityにインスタンスとして配置されたあと、座標の調整や拡大・縮小、削除などをすると、その座標を記録するというものです。Prefabごとにマスクを取る半径情報をもたせてありまして、その範囲が再散布禁止の範囲になります。仕様はシンプルですが、役に立ちました。
大下:実現の方法がスマートで素晴らしいですね。Houdiniによるプロシージャルの生成はすごく便利ですが、手作業を始めてしまうとプロシージャルに戻れないのがまさにアーティストとしての悩みどころですから。Terrainが画像ベースで、そのマスクでコントロールするというところに全てが結実している感じですよね。
桐山:複雑なやり方をするとどこかで破綻したり、バグが出るリスクが高まります。シンプルにマスクを重ねるという処理で良かったと思います。
牛久:岩や小物など、このルール付けに基づいて配置できるものは他にもあると思います。今回このノウハウを蓄積できて良かったです。
大下:本当にそうですね。散布して配置できるものは種類が豊富で、それぞれ配置ルールがちがうわけですから、「プロシージャルの設計の長さ」が今後のプロジェクトでは大きなウェイトを占めてくるように思います。
コリジョンモデルもHoudiniで自動生成
牛久:地形に配置した樹木や岩などのモデルにコリジョンモデルを配置するには数が多すぎるため、手動では対応できません。そこで、Houdiniで配置モデルを読み込み、Terrainとの接地面に自動生成したマスクをコリジョンモデルのメッシュとしてFBXでエクスポートする手法を構築しました。これにより、木々の配置変更に合わせてコリジョンモデルもプロシージャルに再生成できます。
大下:本当にスマートなつくり方ですね。マスクからメッシュにすることで、コリジョンモデルの個数も減りますし。「なるほど、この方法があったか!」というような。
牛久:そうですね。また、3Dのゲームの場合、開発側の意図しない微妙な隙間にハマって抜け出せない「スタック(stuck)」という現象がありますが、Houdiniでマスクの範囲を拡張したり繋げたりする処理を挟むことで、その現象が起こるリスクも減らせました。
桐山:エンジニア目線でも、どこがコリジョンなのか一目瞭然でチェックもしやすいので、“一石二鳥三鳥”みたいな上手いやり方だと思います。
Houdini Engine SessionSyncで高速再配置を実現
大下:今回HoudiniとUnityのデータの行き来が多いわけですが、データのやりとりにはHDA(Houdini Digital Assets)を使っているのでしょうか?
牛久:いえ、Houdiniでパラメータを変更したら、Houdini Engine SessionSyncでUnityと同期するだけです。HDA化も試しましたが、今回のプロジェクトではアセット数が16,000以上あり、動かすパラメータも多いため、処理が重くなり、Unityが落ちることもありました。SessionSyncを使用すると、そういった問題が起こらず、約1秒で再配置が完了するため、今回は直接転送する方法が最適でした。
大下:なるほど。まさにそれを伺いたかったところです。
桐山:HDAは良いものですが、実際のプロジェクトで触ってみないと見えてこない部分がありましたね。
大下:今回Houdiniを使った作業では、アーティストとエンジニアの業務の区分けなどはどうされていたのでしょうか。
桐山:Houdiniでノードを接続してルールをつくって、Houdiniの画面上で何かをする作業は全て牛久が担当していました。私はHoudiniとUnityを連携させる部分の処理を担当しました。先ほどのマスク生成機能などですね。区分けははっきりしていました。
大下:エンジニアとしては、アセット数が多いですから最終的な配置数によってはUnityの負荷もそこそこ上がるのではないでしょうか?
桐山:その通りです。Houdiniと同期して配置されたインスタンスが莫大な量なので、それをいかにUnityのシーン上でさばくのかが課題です。
今取り組んでいるのは、Unityに配置されたPrefabのインスタンスをシーンと分離するためのしくみづくりです。配置情報だけを抜き出して、Prefabはシーンから取り払ってしまうのです。シーンからインスタンスが消えて、配置情報への参照しか残りませんから、同じ種類のPrefabの配置であれば、何万個配置してもたった1個のゲームオブジェクトに集約されて、シーンが軽くなります。
やり方としては、シーンをロードした後に、インスタンスを配置するタイミングで、そのゲームオブジェクトに書き込まれた配置情報とPrefab情報を読み込んで、ランタイムでインスタンスを別途配置するという感じです。
大下:なるほど。この規模だとエディタレベルでの最適化も必要になりますよね。
Adaptive Probe Volumesによるプローブの自動配置
大下:続いて、ライティングについてのトピックです。今回はAdaptive Probe Volumes(以下、APV)を使ったライティングを採用されたということですが。
菅原:『PRINCIPLES』では当社内製のGIを使っていて、それが主に手動でプローブを配置していくシステムでした。あのくらいの広さだと使い勝手が良かったのですが、今回は広範囲でのライティングですから全部手置きというわけにはいきません。そこで、Unity 2022.2から実装されたAPVで試しに実装してみたところ、今回のプロジェクトに合っているという手応えを得ました。
大下:なるほど。実際にどんな手応えがありましたか。
菅原:やはりプローブの自動配置のメリットです。手早くボリュームで大きく囲ってしまって、プレイヤーが良く映る場面だけまた別のボリュームで囲うというながれで、作業時間は本当にすごく減りました。ベイクの時間は内製GIよりかかりますが、配置する時間を差し引いたらAPVのほうが速い。
大下:アセット単位でテクスチャのベイクがいらないですし、今回のオープンエアーのフィールドの場合、比較的APVのデメリットが見えにくいですね。
菅原:それと今回、複雑なジオメトリが大量配置されているシーンということもあって、ベイクが上手く進みませんでした。そのため、樹木の複雑性をGIに反映するのはやめて、オブジェクトを簡略化したものに置き換え、高い木の位置情報に基づいてスフィアを配置し、ベイクを行なっています。
大下:このオブジェクトの配置も、Houdiniの植生の配置情報をベースにプロシージャルで自動化できれば効率的ですね。
菅原:はい、まだそこまではできていないですが、今後実装する予定です。
ライトリークの抑制にもAPVが役立った
菅原:もう1点、ライトリーク対策として、リークが起きやすいところにProbe Volumeを配置して、そこの密度を変えることでリークを抑えました。さらに、Probe Adjustment Volumeのオフセットで、埋まっているところを押し出してあげることでもリークを軽減できました。
また、奥まった場所の室内、ある程度薄い壁であれば、ちょっと力技ですが、プローブを別のメッシュである程度覆えばリークを抑えられます。
菅原:今後はよりAPVを拡張して挑戦していきたいですね。HDRP(High Definition Render Pipeline)ではプローブが時間の遷移にも対応するので、われわれも活用していくつもりです。デザイナーの欲望としては、ポイントをひとつずつ掴んで個別のプローブの明るさを調整できるようにしたいですね。現状のAPVではまだできませんので。
大下:今回のAPV、処理負荷はどの程度ありましたか。
桐山:ライトマップのベイクと大差ないようです。足を引っ張っている形跡もありません。必要十分なところにだけプローブボリュームを配置しているので、それほどメモリには負荷がかかっていませんね。
大下:今回、GIはAPVとリフレクションプローブですか?
菅原:実はまだリフレクションプローブは入っていませんが、入れる方向で進行しています。
大下:入っていない状態でこのクオリティでしたら、入ってからのクオリティも楽しみですね。
継続的な研究により深化するコロプラの技術的ブランド
大下:最後に、今後の全体的な方針を伺えますか。
菅原:前回に引き続き、今回も継続的にHoudiniの実践を進められたということが、コロプラとして大きな1歩となりました。社内のテクニカルアーティストチームもHoudiniに取り組んでいますので、われわれデザイナー、エンジニアと共に組織的に連携を強めて、そういった人材の厚みを増してきたいです。
この検証を通じて明らかになった課題や得られた知見は、また新規プロジェクトに活かし、社内外に積極的に発信することで、コロプラの技術的なブランディング強化に繋げていきます。継続の大切さは『PRINCIPLES』でも打ち出しましたが、しっかり継続している姿をぜひ皆さんに見ていただきたいです。
大下:今回のお話でしっかり伝わると思います。
桐山:エンジニアとしてはまだまだここからが本番。メモリや処理負荷を最適化するという大仕事が残っています。チューニングはプログラムの部分だけでなくて、アーティスト側に相談やお願いをしなくてはいけない部分にもあって、まだ道半ばです。
『PRINCIPLES』はリリース後、派生して検証用プロジェクトや取り組みが生まれました。今回のプロジェクトもまた新しい実験の場になれるよう、場所を整備するつもりで頑張っていきます。
牛久:私の当初の任務内容は、Houdiniを使用して広大なマップ上に大量の植生をレイアウトすることでした。植生の配置だけでなく、デザイナーの意図に沿ったレイアウトを実現できたことと、短期間でビジュアルの向上に貢献できる可能性を感じています。
今後は、植生のレイアウトだけに留まらず、Houdiniを用いて様々なパターンの配置物をモデリングすることで、少ない工数で大規模なマップ制作を可能にしていきたいと考えています。プロシージャルで制作できる部分と、従来の方法で画づくりを追求する部分を上手く棲み分けることで、マップ制作をよりスムーズかつ円滑に進められる環境を整えていけるのではないかと考えています。
大下:今回とても印象的だったのが「視野の広さ」です。ハイエンドだけを見ているわけでも、モバイルだけを見ているわけでもない。ゲーム開発を大きなくくりとして捉えていて、そのグラデーションがすごく綺麗だなと感じました。
桐山:それはコロプラのメンバーが多様だからでしょうか。うちにはモバイル畑やコンシューマー畑の人材はもちろん、別業界からの人材も多数在籍しています。いろんなスタッフがフラットに活躍しているからこそ、そのように見えるのかもしれませんね。
Recruiting Information
コロプラでは3Dアーティストを募集しています。当社はこれまで常に最新のテクノロジーと独創的なアイデアで、人々が見たことのない"新しい体験"を届けることに挑戦してきました。"新しい体験"を私たちと一緒にゼロから創りだしていただける3Dアーティストの方のご応募をお待ちしております。
TEXT__kagaya(ハリんち)
EDIT_小村仁美 / Hitomi Komura(CGWORLD)