Unity を検索

『Book of the Dead』― Quixel、風、シーンの作成、コンテンツの最適化テクニック

2018年6月29日 カテゴリ: テクノロジー | 18 分 で読めます
シェア

このブログシリーズでは、Unity のデモ動画『Book of the Dead』の制作に関するさまざまな側面を見ていきます。 今回は、Quixel との提携、Unity の風のシステム、シーンの作成、コンテンツの最適化テクニックに焦点を当てます。 この「メイキング」ブログシリーズは、今回で 4 回目となります。 過去 3 回の記事では、『Book of the Dead』のキャラクターコンセプトアートフォトグラメトリアセット、樹木、VFX の制作プロセスについてそれぞれ説明しています。まだご覧になっていない方は、ぜひご覧ください。

こんにちは。Julien Heijmans です。Unity のデモチームで環境アーティストとして仕事をしています。 Unity には昨年入社したばかりですが、ビデオゲーム業界で約 7 年間の経験があります。 このブログ記事では、コンテンツクリエイター兼環境アーティストである私の視点から、『Book of the Dead』の制作に関する知見をいくつか紹介します。

私はフォトグラメトリアセット関連の仕事を始めてからまだ日が浅いのですが、数年前に Quixel が Megascans の制作を発表した日のことははっきりと覚えています。 それ以来、Quixel のアセットを使って作業をするチャンスを心待ちにしていました。 Unity のデモチームに加わり、『Book of the Dead』の作業に着手する中で、その望みがついに現実のものとなりました。

このブログで説明されているツールでいろいろ試したいとお考えの方は、Book of the Dead: Environment プロジェクトをダウンロードしてください。

 

プロジェクトのダウンロード

Quixel との提携

Quixel、Megascans、フォトグラメトリ、環境アート

Quixel の Megascans ライブラリのアセットを使用しているだけでなく、本プロジェクトの制作では Unity と Quixel が提携していることを、私はプロジェクトに参加してから知りました。

制作を進める中で、デモチームは必要なアセットのリストを作成し、対応するアセットが既存のライブラリにない場合は、Quixel に新しいアセットをキャプチャーしてもらいました。 このようなアセットの多くは、草木や茂みなどの植物であり、スキャンするには適切な機器と設定が必要です。

Quixel はこのようなアセットのテクスチャシートを提供してくれただけでなく、Unity のウィンドシェーダーに対応する LOD と頂点カラーを設定したジオメトリも作成してくれました。

私たちは 50 を超える高品質で複雑なアセットを提供してもらいました。その一部はリリース済みの Book of the Dead: Environment プロジェクトに含まれています(ティザーで使用されているものの、リリースされていないアセットもあります)。チームに所属する数名のアーティストだけでは、期限までにこれらを制作することは困難だったでしょう。

制作中は、エンジンにアセットを素早く読み込ませることができたため、作業がスムーズに進みました。多くの場合、テクスチャを調整したり(ほとんどの場合は、アルベドと輝度/レベル/カーブの調整。場合により、シーンに合わせてカラーを調整)、テクスチャを適切に再パックしたり、LOD を必要なレベルに微調整したり、テクスチャを新しい HD レンダーパイプライン(HDRP)Lit マテリアルに割り当てたりしました。

幸運にも、Quixel が最近リリースしたツール Megascans Bridge を使うことで、今まで手動で行っていたインポート作業のほとんどが自動的に処理されるようになりました。これにより、HDRP 用のテクスチャなどの再パックにかかる時間が短縮されました。

Megascans のアセットの詳細を知りたい方は、Unity アセットストアの Megascans コレクションをご覧ください。どのアセットも、HDRP またはライトウェイトレンダーパイプライン(LWRP)のプロジェクトセットアップにインポートできます。

植物アセットに適用する風のシステムとそのパイプライン全体の制作は、常に注意が必要です。 それぞれ異なる方法でアニメーション化する必要があるさまざまな種類の植物アセットがあります。たとえば、2 本の木では、それぞれ必要な設定やシェーダーの複雑さが異なる場合があります。

そのため、私たちチームは、植物アセットに対する風のエフェクトに対して、カスタム頂点シェーダーベースのプロシージャルアニメーションを作成することにしました。 特定のプロジェクトとそのプロジェクトに含まれる樹木や茂みと連動するようにアニメーションをカスタマイズしました。そうすることで、風のエフェクトを完全に制御できるようになりました。

シェーダーはチームのテックリードである Torbjorn Laedre が開発しました。このシェーダーはさまざまな種類の植物で使用できます。その際、次の 3 つのテクニックを使います。

  • Hierarchy Pivot(構造/階層が明確に定義されている樹木と一部の植物の場合)
  • Single Pivot(構造/階層が定義されていない草、小さな植物、大きな茂みの場合)
  • Procedural Animation(ピボットを予測できない植物アセットの場合)

樹木は比較的準備に手間がかかるアセットです。内容面に関しては、樹木では Hierarchy Pivot タイプのアニメーションを使用しており、次の 3 つの異なるレベルの階層を利用します。

  • 幹。地面から伸びている。
  • 枝レベル A。幹に接続している。
  • 枝レベル B。枝レベル A の枝に接続している。

シェーダーには、階層のレベルと樹木の各頂点のピボットを認識させる必要があります。 最初に樹木自体のジオメトリを作成した後、緑色の頂点カラーチャンネルを使用して、樹木の各ポリゴンに階層のレベルを割り当てる必要がありました。

  • 頂点カラーのグリーンチャンネルの値が 0 の場合は幹であることを示す
  • 値が 0 から 1 の間の場合は枝レベル A であることを示す
  • 値が 1 の場合は枝レベル B であることを示す

私はこの作業を Autodesk Maya を使って行いました。小さなスクリプトをいくつか使用することで、10 ~ 15 分間でアセットの LOD をすべて設定できました。

これに加えて、「Flutter Mask(揺れマスク)」と呼んでいるものを使用しました。 これは、ジオメトリのどこに枝のピボットを配置するかを決定するのに役立つテクスチャマスクです。私たちは、ジオメトリのハードアルファテクスチャを使用している枝にこのマスクを使いました。このマスクの図は次のとおりです。

この情報をすべて準備したら、C# スクリプトを使用して、樹木のプレハブを入力し、すべての頂点のピボット情報がベイクされた新しいプレハブを生成することができます。シーンに WindControl オブジェクトを追加したら、シーンに樹木をインポートしてマテリアルのプロパティを調整できます。

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

ご覧のとおり、各階層レベルに範囲のプロパティ(基本的には幹または枝の長さを制御)と弾力性のプロパティがあります。

風による揺れのアニメーションを設定するプロパティは他にもいくつかあります。このプロパティで頂点位置にプロシージャルノイズを少し加えて、枝に風が吹いたときの枝の揺れを再現します。

最後に大事なことですが、風のアニメーションが風のサウンドエフェクトの影響を受けるようにする必要もありました。つまり、音量に応じてアニメーションの風を強くするのです。意外にも、単純なアイデアがプロジェクトに大きく貢献することがあります。まだご覧になっていない方は、プロジェクトを開いて見て回るといいでしょう。近くで突風が吹く音が聞こえたときに、樹木とその周囲のすべての草が揺れていることに気づきます。

レイアウト

Book of the Dead』のようなプロジェクトの詳細度と密度を決める際には、後の制作過程でパフォーマンスの問題が発生するのを防ぐために、レベルを構成する方法を検討することが重要です。 私が注意しようとしたことの 1 つに、シーン内の遠景の制限があります。 シーンのレイアウトに「回廊地帯」や「隘路」を設けると、遠景を減らすことができます。

このようなレイアウトに加えて、アセットの「Occluder static」フラグと「Occludee static」フラグを正しく設定することで、Unity のオクルージョンカリングが効率化されます。

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

このビデオでは、オクルージョンカリングの視覚化を紹介します。トップビューを見れば、カメラが向いている方向を簡単に推測できます。ビデオの終盤では、オクルージョンカリングを有効/無効にし、オクルージョンカリングによってカリングされるオブジェクトを確認します。

また、カリングされないオブジェクトがあることもわかります。そのうちほとんどは背の高い樹木であり、25 メートルを超えるものもあります。バウンディングボックスが非常に大きいため、崖の背後でもカリングすることは困難です。

Unity のレガシーなテレインの使用

トレーラーを公開したとき、レガシーなテレインシステムを使っているはずがないというコメントを見かけましたが、 私たちが使用しているのはまさしくそのレガシーなテレインシステムです。私たちは HDRP の LayeredLit シェーダーを改造してそれを扱えるようにました。

HDRP のレイヤーシェーダーを使用すると、ハイトマップテクスチャを使用してレイヤーをブレンドすることができます。そのため、レガシーなテレインシェーダーに搭載されたリニアブレンドよりも優れた結果が得られます。

このアニメーションでは、各レイヤーの高さのオフセットを変更するだけ。

これはもちろん一時的な解決策であり、正式に UI に統合されているものではありません。テレインを変更するには、テレインに適用されているマテリアルを編集する必要があります。テレインオブジェクトの Paint Texture(テクスチャのペイント)タブにある Edit Texture(テクスチャの編集)ボタンは使用しません。

これらのレイヤーは主にテレインの各レイヤーをペイントするときに役に立つ。タイリングの設定を除き、テレインのレンダリングには使用しない。
レイヤーではなく、テレインに適用されているマテリアルを探す。そうすることで、テレインが影響を受けているテクスチャとマテリアルのプロパティをすべて確認できる。

新しいテレインを作成して別のテクスチャを適用する場合は、この TerrainLayeredLit マテリアルを複製し、新しいテレインに割り当てる必要があります。また、Paint Texture タブでテクスチャセット 4 つを作成する必要もあります。そこで割り当てたテクスチャはテレインのレンダリングには使用されませんが、テクスチャを割り当てることで、テレインの各レイヤーをペイントできるようになります。各レイヤーのタイリングのプロパティの変更も、そこで行うことができます。

LODGroup 機能を十分に活用するには、テレインに配置するすべてのアセットを、ディティールのアセットではなく樹木として設定します。

ただし、実際には、このプロジェクトでは、草、茂み、木、小枝、岩など、非常に多くのアセットが地面に散在しています。こうしたあらゆるものを含め、テレインは非常にシンプルにすることが可能です。以下で説明するとおり、このショットのテレインは単純なタイリングマテリアルです。

散在している詳細アセット

レベルを歩き回ると、大量の小枝や松かさが地面のあちこちに散らばっていることに気づくでしょう。

これらはただレベルを歩き回っているときにはあまり目立ちませんが、地面に注目するようになると、シーンの詳細度が大きく上がります。場合によっては、何百本もの小枝が、樹木から落ちてそこに溜まったかのように、地面の岩や枯木の幹の隙間に落ちています。これらを手作業で配置することは不可能でしょう。そこで、Torbjorn Laedre がこのような小さなオブジェクトをレベルの各所に配置するためのツールを作成しました。

小枝の正体は、アルファマテリアルを配置したシンプルなカットアウト平面です。私たちはこの平面にカプセルコライダーを追加しました。

スクリプトを使い、まずトランスフォームポジションの周囲に必要な数量の散布オブジェクトを生成します。続いて、地面の上に落下するようにオブジェクトの物理シミュレーションを実行し、テレインとその他のすべてのアセット(岩、枯木の幹など)と衝突させます。 Bake(ベイク)ボタンを押すと、これらはコライダーから切り離され、1 つのオブジェクトに結合されて、LODGroup に割り当てられるとともに、オブジェクトがカリングされる距離が指定されます。

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

このスクリプトはシーン内の「UberTreeSpawner」というオブジェクトによって使用されています。もしご希望であれば、自由にお使いください。

ちなみに、このツールを使用する場合、小枝やその他の散布オブジェクトが地面などのアセットの上に正しく落ちるようにするには、シーン内のすべてのアセットで非常に密度の高い Mesh Collider を使用する必要があります。ただそうは言っても、ゲームの実行時にはこのような重いコライダーを使用しないほうがよいでしょう。そのため、シーン内のほとんどのアセットには、2 つの異なるコライダーが使用されています。1 つは、PlayerController によってプレイモード時にリアルタイムで使用される軽いコライダーであり、Default レイヤーが割り当てられています。もう 1 つは、このような小枝の物理シミュレーションにのみ使用されるコライダーであり、「GroundScatter」レイヤーが割り当てられています。

ライティング

Book of the Dead: Environment プロジェクトでは、Baked Indirect モードのグローバルイルミネーションと、リアルタイムの直接光を使用しています。

太陽の間接光と空の直接光と間接光の両方が、ライトマップとライトプローブにベイクされています。Reflection Probe、オクルージョンプローブ、その他のオクルージョンソースも同様にベイクされています。一方、直射日光はリアルタイムライティングです。HDRP でのシェーディングは、リアルタイムの直接光を使用した場合に最も魅力的に見えます。また、実行時にディレクショナルライトの回転、強度、色温度をある程度自由にアニメーション化することができます。

間接光がベイクされているため、ディレクショナルライトの強度とカラーはあまり変えることができません。大きく変えてしまうと、ベイクしたライティングと適合しなくなります。森という環境は適合していない間接光をかなりの程度まで目立たなくすることが可能な環境ですが、このセットアップでは、昼夜のサイクルをうまく処理することができないでしょう。

ベイクされたライトマップは、ほとんどの場合、テレインやその他のいくつかのアセットで使用されますが、私たちはプロジェクト内のすべての岩と崖にライトプローブとオクルージョンプローブを組み合わせて使用したいと考えました。その方が、鋭角を持つオブジェクトや鮮明な法線マップを持つオブジェクトでより優れた結果が得られるからです。

オクルージョンプローブ

密林のライティングをリアルタイムで実行する場合、若干の注意が必要です。樹木とその葉や枝は、表面積が非常に大きく、形状も複雑です。そのため、これらをライトマップで覆うことは現実的ではありません。1 本の樹木に 1 つのライトプローブを使用した場合、根本から梢までライティングが均一になってしまうでしょう。Light Probe Proxy Volume はそれよりも理想に近いものでしたが、グリッド解像度を上げて細部をキャプチャーすることは現実的ではありません。

そこで、シニアグラフィックスプログラマーである Robert Cupisz がオクルージョンプローブを開発しました。

アーティストの観点から見て、オクルージョンプローブは非常に使いやすく優れた機能です。シーンにオブジェクトを追加するだけで、ボリュームのギズモが表示されます。これは、目的のエリアに合わせて規模を変更する必要があります。そうすると、X、Y、Z 軸の解像度パラメーターが設定されます。

また、シーンの一部のエリアのプローブ密度を上げたい場合は、「詳細な」オクルージョンプローブを作成することもできます。設定したら、シーン全体のライティングをベイクする必要があります。その過程でオクルージョンプローブがベイクされます。

3D グリッド内の各プローブは、上半球に光線を照射することで、空の可視性をサンプリングし、0(完全に遮蔽)から 1(完全に可視)の 8 ビット値として保存します。これにより、葉や枝が濃く密集している場所ほど暗くなるようになります。数本の樹木が群生している場所はさらに暗くなります。

運悪く幹や岩の中に入ってしまったプローブは、完全に真っ黒になります。このプローブの暗さが外部に影響するのを防ぐために、プローブを無効としてマークし、隣接した有効なプローブで上書きします。

プローブは空の可視性の度合いをサンプリングするものであるため、直接的な空の影響のみを減衰させるようにプローブを設定する必要があります。このため、ライトマッパーは通常のライトプローブから直接光の影響を除外するように設定され、その後、プローブのライティングは、ライトプローブと、オクルージョンプローブで遮蔽された直接スカイプローブで構成されます。

この方法なら、葉による空の遮蔽具合を非常に細かくサンプリングする負荷の低いオクルージョンプローブを大量に用意して、映像に奥行きを与えることができます。また、緩やかに変化する間接光をサンプリングする負荷の高いライトプローブをほとんど使用せずに済みます。

オクルージョンプローブがシーンに及ぼす影響をより明確に把握したい場合は、SkyOcclusion デバッグビューも使用できます。

オクルージョンプローブをベイクしたり、直接的な空の影響をライトプローブから除外したりするためのオクルージョンプローブ API が Unity 2018.1 に追加されました。このスクリプトとシェーダーはすべて、このプロジェクトでご利用いただけます。

大気散乱

私たちは、元々 Blacksmith のデモのために開発した大気散乱ソリューションを移植して再利用しました。

シニアプログラマーの Lasse Jon Fuglsang Pedersen が、一時的にスーパーサンプリングを使用するようにこれを拡張した結果、見た目が非常に滑らかになりました。

HDRP の透過性

HDRP のデフォルトの Lit シェーダーは、数種類の拡散をサポートしています。HDRP では、サブサーフェススキャタリングを使用したマテリアルや、(このプロジェクトのすべての植物で使用されているような)透光性だけを持つシンプルな半透明のマテリアルを利用することができます。

このエフェクトは 2 つの異なる場所で設定します。

  • マテリアルで、「Translucent(半透明)」マテリアルタイプを選択し、Thickness map(厚さマップ)を入力してから、拡散プロファイルを選択する
  • 拡散プロファイルの設定で、透過エフェクトの他のすべてのパラメーターを編集する

注:デモチームでは、最終結果をさらに細かく調整できるように、直接透過性と間接透過性を個別に制御するスライダーを追加しました。ただし、この変更は物理ベースレンダリングのルールに従っていないため、HDRP には反映されません。

エリアボリューム

エリアボリュームは、SRP が提供するコアボリュームシステムをもとに開発されており、ポストプロセスボリュームに非常によく似ています。エリアボリュームの機能は、Main Camera オブジェクトのポジションに応じてオブジェクトのプロパティを変更することです。

ディレクショナルライト、大気拡散、自動フォーカス、WindControl など、いくつかのオブジェクトには、エリアボリュームによって変動するプロパティがあります。そのため、たとえば現在のライティング設定を変更する場合は、対応するエリアボリュームでその変更を行う必要があります。このようなエリアボリュームオブジェクトは、_SceneSettings > _AREASETTINGS にある Main Scene 内にあり、「_AV」というサフィックスが付いています。

デバッグウィンドウ

HDRP をあまり使ったことがない方のために説明すると、HDRP には専用の SRP デバッグウィンドウがあります。このウィンドウは、Window(ウィンドウ) > General(一般) > Render Pipeline Debug(レンダーパイプラインのデバッグ)メニューから開くことができます。

このウィンドウを使用すると、各 G バッファレイヤー、ライティングコンポーネント、マテリアルの特定のテクスチャマップを確認できます。また、アルベド/スムースネス/法線をオーバーライドすることもできます。正しくレンダリングされていないオブジェクトがある場合やその他の視覚的バグが発生した場合、これは非常に便利なツールです。 問題の原因を非常に短時間で特定することができます。

最も優れているのは、これらのデバッグビューはシェーダーから自動的に生成されるという点です。コーダーは新しいデバッグビューを非常に簡単に作成できます。

Render Pipeline Debug(レンダーパイプラインのデバッグ)ウィンドウから利用できるデバッグビューの一部

私は、シーンの背景に使用する樹木のビルボードを作成するためにこのようなデバッグビューを使用することもありました。空のシーンにアセットを配置し、アルベド、ラフネス、法線 G バッファレイヤーが表示された状態のスクリーンショットを撮り、それをテクスチャマップの作成に使用しただけです。

最適化

最適化の大部分はコード側で行われますが、一定のフレームレートを得るためには、アセットとシーンを正しく設定することも重要です。 ここでは、このプロジェクトのコンテンツを最適化した方法をいくつか紹介します。

  • すべてのマテリアルで GPU インスタンシングを使用しています。
  • このシーン内のアセットの大半に LOD を使用しています。これは必須です。
  • LOD クロスフェードは、異なるオブジェクトの詳細度を非常にスムーズにブレンドできる優れた機能です。ただし、この機能は非常に重く、プロジェクトのドローコールの数が大幅に増加することがあります。そのため、この機能はできるだけ多くのアセットで無効にしました。
  • LOD 間の遷移を目立たなくするために、大きな岩と崖のアセットの多くでオブジェクト空間法線マップの使用するようにしました。

注:接空間法線マップの代わりにオブジェクト空間法線マップを使用すると、法線マップの精度が低下します。これは、非常に粗くてノイズが多いアセットでは精度の低下はそれほど目立ちませんが、おそらくハードサーフェスアセットには使用しないほうがよいでしょう。

  • シーンの構築方法とオクルージョンカリングで表示距離を制限することも重要ですが、シーンのレンダリングに使用されるドローコールの多くは、実際にはシャドウマップの各カスケードのレンダリング(私たちのプロジェクトの場合はディレクショナルライト)に由来していることを知ることも重要です。
  • このプロジェクトでは、テレイン上に散らばっている小さな植物アセットに由来するドローコールが大量にありました。何百ものドローコールが発生している場所もありました。このような草木のアセットのパッチを大きくすることで、私たちはドローコールをかなり減らすことができました。この結果、ドローコール数を数百から 15 〜 20 まで削減できました。
    ただし、これを行うと大きなアセットなどのビジュアル品質に影響が生じます。地面に配置されている岩などのアセットによる草のクリッピングを防ぐことが非常に困難になります。
  • レイヤーカリングを使用しています。この機能は以前から Unity にありますが、UI が用意されていません。この機能を使用すると、カメラからの距離に応じて、特定のレイヤーに割り当てられているオブジェクトをカリングすることができます。Torbjorn はこの機能を拡張し、オブジェクトの影付けも距離に応じてカリングできるようにしました。たとえば、約 15 メートルの距離にある小さな植物アセットの大部分は、影が付かないようにしています。地面にある草やその他の植物のノイズの量を考えると、これはそれほど目立ちません。その後、距離が約 25 メートルになると、LODGroup の設定に関係なく、影は完全にカリングされます。

---

本シリーズの次の記事も楽しみにしていてください。 次回は『Book of the Dead』のシェーディング、ライティング、ポストプロセッシングなどの作成に関する作業をご紹介します。

 

Unite Berlin に参加できない方のために、デモの環境アートに関する Julien Heijmans のプレゼンテーションを近日中に公開する予定です。 Unity の YouTube チャンネルをフォローしていただくと、プレゼンテーションビデオの公開をいち早く知ることができます。

 

Book of the Dead』に関する詳細はこちらでご覧ください。

2018年6月29日 カテゴリ: テクノロジー | 18 分 で読めます