『Baymax Dreams』を手掛けたエミー賞受賞チームによって制作された『Sherman』は、Unity の HD レンダーパイプライン(HDRP)を使って作られた新作ショートフィルムです。
私は Jean-Philippe Leroux です。Unity のメディアおよびエンターテインメントイノベーショングループでライティングスーパーバイザーを務めています。2 年前に Unity に入社して以来、ニール・ブロムカンプの『ADAM: Episode 2』および『Episode 3』や、エミー賞を®受賞した『Baymax Dreams』など、すばらしいプロジェクトに参加させてもらっています。
これを読んでいる皆さんはおそらく、現在業界に起こっている大きな変化について聞いたことがあると思います。それは、リアルタイムプロダクションの登場です。
リアルタイムアニメーションは、単に新しいレンダリングソリューションという域を超え、制作パイプライン全体に革命を起こしつつあります。リアルタイム制作エンジン(当初はビデオゲーム開発用に作られたため、ゲームエンジンとも呼ばれます)はいまや、映画品質のコンテンツ作成に対応した制作ハブに求められる高度な品質と成熟度を備えたものになっています。
しかし、リアルタイムレンダリングはオフラインレンダリングとどのように違うのでしょうか。巨大なレンダーファームで何時間もかけて処理するスタイルから、フィードバックを瞬時に取得し、最終的な 4K フレームを数秒で生成するスタイルへと、どのように移行できるのでしょうか。それを実現しているのは、魔法でも何でもありません。すべては、簡略化、近似、最適化、そしていくつかの賢い裏技を駆使することで実現されています。
アニメーションのショートフィルム『Sherman 』の制作にあたって私たちが目標に据えたことの 1 つは、HDRP のメリットを活かして、かつてなく高度なリアルタイムの映像処理を実現することでした。ただし、この記事では、私たちが『Sherman』のためのリアルタイムライティングソリューションを Unity でいかにして実現したのかに焦点を置き、皆さんがご自分のプロジェクトに活用できる、具体的なアドバイスや豆知識を交えながら、お話をしていきます。3D アニメーションエキスパートにとっても、従来のライティングアーティストにとっても、この記事は、Unity のリアルタイムコンテンツ用にリッチで微妙なライティングを作成するための有用な情報源となるでしょう。
Sherman の 1 場面であるこのフレームでは、ライティングに関して色々な処理が施されています。これを処理ごとに分解して、全体がどのように合成されているか見ていきましょう。このショットを例に用いて、皆さんが Unity のライティングエフェクトをご自分のプロジェクトで使用する際に知っておくべきポイントを説明していきます。
この画像を作成するために使用されたライティングエフェクトは、4 つのタイプに分類できます。それらを分類したうえで、それぞれの制御方法について説明していきます。
私たちはまず、シーンに対する環境光ライティングを定義することから始めました。シンプルな環境タームを使用するのではなく、Unity プログレッシブライトマッパーを使用して、グローバルイルミネーションの結果をライトマップにベイクし、ローカライズされた環境光ライティングを作成しました。
私たちのプロジェクトはマルチシーンセットアップです。静的なシーン要素はすべて、episode_set シーンのゲームオブジェクトの下に存在しています。
セットのライティング要素は episode_set_lighting シーン内にあり、このシーンが、Unity でアクティブシーンとなっています。生成されたライティングデータがどこで使用されるかはアクティブなシーンによって決まるので、これは重要なポイントとなります。マルチシーンワークフローの詳細については、こちらで説明されています。
001_timeline シーンは、セットのライティングを作成するうえでは必要ないので、このプロセス中にはこれをアンロードしておきます。よく見ると、ToHide というラベルのセクションがあることに気づくと思います。 この中には、カメラと、太陽のディレクショナルライトのインスタンスがあります。一部のポストプロセシングエフェクト(トーンマッピングやアンビエントオクルージョンなど)はライティングにとって重要ですが、それらを表示するにはカメラが必要になります。セットをライティングする間だけ使うカメラもありますが、プロジェクトが完全にロードされる際には、1 つのカメラだけが残るようにする必要があります。ベイキングが完了したら、「ToHide」のデバッグカメラとライティングを再度非表示にする必要があります。
特定のライトマップ内では、すべてのオブジェクトについて UV が重複しないようにする必要があります。つまり、各サーフェスに一意の UV が必要になります。多くの場合、ライトマップの UV はインポート時に Unity で自動的に生成できます(このトピックについては、こちらで詳しく説明されています)。一般的に、複雑で有機的なオブジェクトについては、アーティストが好みのデジタルコンテンツ制作(DCC)ソフトウェアを使用して、手動で UV2 を作成したほうが効果的です。継ぎ目の縫合は、ライトマップ内の連続していないエッジについて、滑らかな結果を得るための簡単な方法です。
それでは、「Lighting」タブを見ながら、『Sherman』のこのシーンの作成に使用された設定について説明していきましょう。
シーン内の個別のメッシュについては、「Scale In Lightmap」のパラメーターを意識し、それらを利用することが非常に重要です。小さなオブジェクトで、複数のライトマップテクセルをカバーするにはトライアングルが小さすぎる場合には、この値を高くします。遠くにある大きなオブジェクトについては、この値を低くします。ライトマップの解像度は、「Baked Lightmap」ビューと「Show Lightmap Resolution」を有効にすることで、簡単にプレビューできます。
オブジェクトによっては、ライトマップに適さないものもあります。複雑なマルチサーフェスのオブジェクトをライトマッピングの対象としてマークすることは避けましょう。また、グローバルイルミネーションに大きく影響しない小さなオブジェクトや、ライトマップに対してコストが高すぎるオブジェクトについても、ライトマッピングから外すようにしましょう(たとえば、草、葉、小石、がれきなど)。「Lightmap Static」をオフにしておけば、これらを回避できます。
大きいオブジェクトでも、ものによってはライトマッピングにあまり適さない場合があります(本作品の場合は生垣など)。ただし、その場合でも、それらを解に反映する必要はあります。ライトマッピングを適用せずにエンティティを計算に含めたい場合は、「Scale In Lightmap」の値をゼロに設定することで対応できます。たとえば、エッジセクションでは、生垣によって出来たオクルージョンがはっきりと確認できますが、これらはライトマップされていません。
環境光とライトマッピングの設定が完了したら、プローブ配列を使用して、残っている小さなオブジェクトや動的なオブジェクトをライティングします。『Sherman』では、1 メートル間隔のプローブ配列を作成しました。
芝生などの大きなオブジェクトについては、ライトプローブプロキシボリュームを上手に使うことで、より洗練されたプローブライティングを実現できます。その場合、オブジェクトは 1 つのプローブによってではなく、局所化された複数のサンプルプローブによってライティングされます。
役に立つ豆知識:マルチシーンセットアップでは、最後にロードされたシーンからのライトプローブだけが考慮されるという点を知っておくことが重要です。
ここまで、局所化された環境光を効果的に生成する方法を紹介しましたが、ライトの届かない領域が地面のオブジェクトと一緒に塗りつぶされないかということは、どうやって確認すればよいのでしょうか。
まずは、お好みの DCC を使用して、一部のオブジェクト(犬小屋の中やアライグマの口の中など)に対するアンビエントオクルージョンマップを生成する必要があります。
次に、要素を接合するために、スクリーンスペースアンビエントオクルージョン(SSAO)というポストプロセシングエフェクトを使用します。
このエフェクトについては、後述するポストプロセッシングのセクションでさらに詳しく説明します。
リアルタイムでは、間接スペキュラーライティング(リフレクション)は複数のテクニックを複合的にレイヤリングすることで実現されます。レイヤーの順序は次のようになります。
リフレクションの解像度とキャッシュサイズは、HDRenderPipelineAsset で管理されます。基本的に、平面反射は鏡です。これらはフラットサーフェスに最も適していますが、より複雑な状況で使用することもできます(アライグマと膨らんだホースをつなぐ目的でも使用しました)。ただし、メモリの面で高コストになる場合があるので注意が必要です。
リアルタイムのリフレクションプローブは、光源のリフレクションとオクルージョンの中に重要なディテールを表示するために、戦略的に使用することもできます。今回のケースでは、小さなリアルタイムの球状プローブを使用してボウルを囲むことで、膨らんだホースが破裂しようとしている状況を反映させました。
ベイク済みリフレクションプローブは、セットを覆うように使用する必要があります。これには、サイズの優先順位を利用します。これは、投影ボリュームと高度なブレンディングモードによって提供されるパララックス修正です。経験から言って、キャプチャーポイントは、カメラワークが実行される平均の高さに配置するのが効果的です。
よく見ると、一部のリフレクションプローブが、影になるエリアを意識して配置されていることがわかると思います。これは、指向性の強い空の光によって要らないスペキュラー反射が起こるのを回避するために配置されたものです。
タイムラインは、アニメーションベースのあらゆる要素を管理するためのシーケンサーであり、その管理の拠点です。ここから、多くのオブジェクトをアニメーション化することができますが、私たちの場合、ショット単位のライティングを作成する際には、アクティベーショントラックを使用しました。個人的には、ライティングリグのすべてのコンポーネントをショット単位でアニメーション化するよりも、特定のショットの専用のグループを管理するほうが簡単だと思っています。
いくつかのコツ:
プレハブは、何度も再利用する必要があるオブジェクトをグループ化するのに役立ちます。プレハブでグループの設定を変更すると、すべてのインスタンスにそれが自動的に反映されます。Unity のプレハブインスタンスを使用すると、作成した派生項目を簡単かつ選択的に元に戻したり、それを元のプレハブに再度適用して、変更を瞬時に反映したりすることができます。また、このシステムにより、シームレスな派生ワークフローを実現するフレームワークが提供され、インスタンスを調整したり、代替のバリエーションをすばやく作成して検証することが可能になります。
バージョン 2018.2 から、Unity では入れ子構造のプレハブがサポートされています。このセットアップは、ライティングリグをすばやくイテレーションするのに最適です。下記の例は、最初のアニメーションビートのライティングプレハブ構造を示したものです。アクティベーショントラックによって駆動するショット単位の構造が表示されています。ショット中に存在するライティングオブジェクトだけが表示されるので、その他の項目は現在非表示になっています。
シーン階層のライティング部分には、次の項目があります。
プレハブを使用するもう 1 つのメリットは、オブジェクトがシーン内でインスタンス化されたら、ソース管理でシーンをチェックアウトしたままにしておかなくても、ライティングを操作できるという点です。これは、チームの他のメンバーがそのシーンを操作できるということを意味します。
なお、重要な点として、一部のプロパティはプレハブ内で派生させることができないため、バリエーションを作る場合はカスタムインスタンスが必要になります。これに該当するのは、Volume Profiles、Post-Processing Profiles、Timelines などのスクリプタブルオブジェクトです。
太陽のインスタンスは、各ショットグループの中に存在します。これを使用して、太陽の向きをショットごとに微調整できます。また、私たちは木のカットアウトも使用して、効果的なシャドウを丁寧に作成しました。
HDRP ではフォワードレンダリングで作業することにより、Percentage Closer Soft Shadow(PCSS)の後にさらに処理を加えることができます。このツールを使用すると、ライトの半影をシミュレートできます。
リアルタイムでは、ライトはレイトレーシングされず、シャドウはシャドウマップというテクニックによって推論されます。シャドウはゼロコストではないので、各ライトに対して有効化する必要があります。HDRP のシャドウアトラスシステムでは、シャドウを投影するライトを多数使用できます。私たちは最大限のアトラスを使用しましたが、注意していただきたいことは、大きなアトラスを使用した場合、品質はその分良くなりますが、情報が増える分、計算時間の観点では高コストになるという点です。
アトラスが満杯になった場合は、システムによってシャドウが動的に再スケーリングされます。シャドウ解像度はライトごとに定義されます。私たちのセットアップでは、Punctual Light が 1024、Directional Light が 4x2048 に設定されています。なお、ポイントライトは 6x1024 (キューブを表すため)なので、非常に高コストです。
ディレクショナルライトのシャドウには、カスケードシャドウマップ(CSM)というテクニックを使うのが効果的です。最適な品質を確保するには、 HD Shadow Settings コンポーネントのオーバーライドを使用して、分布とカスケードをショットごとに微調整する必要があります。また場合によっては、Cinemachine Virtual Camera のレンズ設定で、ニアクリップ面を調整することも必要になります。これにより、最初のカスケードが前方にプッシュされます。このプロセスは、使用しているレンズの長さに応じて、より重要になります。
HDRP では、レンダリングとポストプロセッシングに関する多くのプロパティが、「プロファイル」に関連付けられたボリュームによって決定されます。Unity 2019.1 からは、これら両方のプロパティセットが同じボリュームコンポーネントにマージされ、カテゴリ別に整理されるようになりました。プロファイルの値は、現在のカメラ位置に応じて補間されます。カメラがどのボリュームにも属していない場合、そのカメラはグローバルプロファイルにフォールバックされます。
各ボリュームには、優先順位とウェイトの値があります。残念ながら、プロファイルの値はアニメーション化できませんが、優先順位とウェイトの値はアニメーション化できます。電気ショックエフェクトのポストプロセッシングは、まさにこの方法でアニメーション化されました。
Unity では、エンティティを特定のライトレイヤーに割り当てることができます。私たちは、キャッチライトを手動で配置し、アライグマの目を生き生きと見せるためにこの方法を使いました。この機能は、塗りつぶしやリムライティングに使用した多数の Punctual Light から生じる、不要なスペキュラーハイライトを管理する目的でも使用されています。また私たちは、Punctual Light が水のエフェクトと干渉するのを防ぐ目的でも、この機能を使用しました。
HDRP の面白いライティング機能の 1 つとして、ライトの最大スムースネスを調整する機能があります。このテクニックは、スペキュラー光源のサイズの分散をシミュレートするために使用できます。
また、ライトを Affect Specular にするか Affect Diffuse にするかを指定して、それらの設定がコンテンツにもたらす効果をテストすることもできます。
大気エフェクトは、シーンの深度を作成する際に重要となるツールです。HDRP の高品質ボリューメトリック(HDRP の設定で定義されます)は、ユーザーに強力なソリューションを提供します。ユーザーは、Volumetric Lighting Controller を使用して、エフェクトの品質を最大化することができます。
私たちはエフェクトを最適にローカライズするために、Sherman で密度ボリュームを使用しました。そしてここでも、 ショットごとの配置を行って、それらの表示を詳細に制御しました。
カラーグレーディングはいまや、あらゆる制作プロセスにおいて不可欠な機能となっています。その優れた効果は、Unity 内から直接適用することができます。ポストプロセシングエフェクトは、2019.1 から HDRP に完全に統合されています。ここでは、ポストプロセッシング V2 スタック(HDRP 2019.1 に統合されているポストプロセッシング V3 スタックとは互換性がありません)を使用して、Sherman でのワークフローをご紹介します。当時と現在では変わっている点もありますが、コンセプトはすべて同じです。
ポストプロセシングエフェクトは、ボリュームに対して機能します。カラーグレーディング、アンビエントオクルージョン、グレイン、および Filmic Motion Blur は、ライティング対象のシーンに存在するマスターボリュームで定義されます。これらの値の一部は、タイムラインでアクティベートされたショット単位のセットアップに含まれる、より優先順位の高いボリュームによってオーバーライドされます。
カメラ関連のエフェクト(ブルーム、被写界深度、ビネット)はすべて、CinemachinePostProcessing 拡張を使用してそれぞれの Cinemachine Virtual Camera 用に作成された、カスタムプロファイルで定義されます。Unity 2018.4 では事前露出がまだ使用できなかったので、特定の箇所については、Post Exposure のオーバーライドも使用されました。
全体的なレンダリングは HDR リニア空間で実行されるため、色の出力を定義することはきわめて重要です。このプロジェクトは、最初から ACES 出力(Academy Color Encoding System)を使用するように設定されていました。ACES トーンマッピングでは、暗いトーンが強調された高コントラストの画像が得られます。私たちは、アップリフティングカラーパレットを使用するために、ガンマを調整する必要がありました。このトーンマッピングスタイルを導入しているゲームでは、多く場合に同じことが行われます。
新しいトラックボールツールは、Unity チームが自信を持って提供する機能です。トラックボールコントロールは、あらゆるプロフェッショナルにとって馴染みのあるツールです。操作が簡単で、私たちも非常に気に入っています。
一度に表示できるのは 1 つだけですが、グレーディングカーブは多数用意されています。私たちは、Hue vs Sat、Sat vs Sat、Lum vs Sat を使用しました。
メインカメラには、ポストプロセスデバッグコンポーネントも追加されました。このコンポーネントからは、波形モニターとヒストグラムをアクティベートできます。波形は、黒と白の状態を分析するための非常に強力なツールです。
アンビエントオクルージョンについては先ほども説明しましたが、いくつかの設定についてもう少し詳しく見ていきましょう。強度は 0.75 に設定されていました。一部のショットでは、木の枝葉に多く見られるノイズパターンを減らすために小さく設定されました。Color や Direct Lighting Strength などの物理ベースレンダリング(PBR)でないオプションは使用しませんでした。このエフェクトは解像度に依存するので、目的の出力解像度に合わせて調整するようにしてください。
DOF は高速レンズの単なる副産物ではありません。ストーリー内でのフォーカスを強調するために不可欠なツールです。画像がすばやく動く場面では、見る人の注意を丁寧に誘導する必要があります。
Cinemachine には、フォーカスを追跡するための便利なオプションがあります。このポストプロセッシングツールは新バージョンで全面的に刷新され、もはや解像度依存の機能ではなくなりました。2018 バージョンの Unity では、Visual Effect Graph の透過性レンダーキューは使用できませんでした。そのため、『Sherman』では、一部のショットに含まれる水のエフェクトで、被写界深度が浅くなるのを回避する必要がありました。しかし 2019.2 では、この Visual Effect Graph 機能が使用できるようになりました。
ビネットは効果的なエフェクトですが、使いすぎてしまいがちな機能でもあります。ビネットを使用すると、レンズを通じて映るアーティファクトを再現して、フレームの隅で発生するライトの消失を視覚的に表現することができます。リアリズムを持たせるため、このエフェクトは常に丸みをつけて使用するようにしましょう。
ブルームは、カメラセンサーや汚れたレンズ上での強いライトブリーディングによって出来る、美しいアーティファクトです。このエフェクトは Unity でシミュレートできますが、このテクニックもやはり、加減に注意して使用する必要があります。
アニメーションのライティングは複雑で、マスターするのが難しい操作です。この記事では、リアルタイムレンダリングでのライティングについて、従来型のライティングアーティストが知っておくべきことをさまざまな角度から説明しました。この記事の内容を役立てながら、ここで紹介したコツを実際に試していただけたら幸いです。
私自身、従来型ライティングの「古き良き時代」に戻ることは今や考えられません。リアルタイムアニメーションは、制作現場に革命をもたらし、可能性に満ちた新しい世界を創り出そうとしています。リスクを受け入れ、失敗を恐れずに実験してみる心の余裕を持てば、これまでにないメリットが必ず得られるでしょう。
『Sherman』の詳細(プロジェクト全体へのアクセスを含む)については、Unity の映像制作向けソリューションのページをご覧ください。皆さんのプロジェクトを成功に導くために Unity とイノベーショングループがどのような支援を提供できるかについては、こちらからお問い合わせください。