Unity を検索

Spotlight チームのベストプラクティス ― 現実のようなビジュアルを Unity で作成しよう

2018年3月9日 カテゴリ: Engine & platform | 13 分 で読めます
取り上げているトピック
シェア

Is this article helpful for you?

Thank you for your feedback!

私は Spotlight チームの一員として、数々の興味深いプロジェクトに関わることができることを幸運に思います。Unity の Spotlight チームは、お客様と共にゲームの開発に携わらせていただいています。私の主な役割は、デベロッパーの皆様が目標とするビジュアルや品質の実現に向けてサポートすることです。業界の多方面から私の元へ様々な情報が集まって来ますので、コンテンツ制作者が頻繁に直面する問題を私はある程度把握することができます。私がこれまで関わらせていただいたプロジェクトのいくつかは、現実世界のようなビジュアルを目標とするものでした。Unity で、プロジェクトのアートコンテンツに合わせて、現実的で説得力のあるビジュアルを持つシーンを作成するには、どうしたら良いのでしょうか。

真に迫る現実的なビジュアルを作成するためには考慮しなければならない要素が数多くあります。本記事では、ライティングとレンダリングの設定についてお話したいと思います。記事中ではサンプルシーン『Spotlight Tunnel』を使った学習および実験を行う方法をお伝えします。

Unity のレンダリング設定を準備する

現実世界をリアリスティックに再現するためには Unity のレンダリング機能をどのように使用したら良いか、それを理解することでプロジェクトの目指すビジュアルの実現に一歩近付きます。

リニアレンダリングモード
簡潔に言うと、モニターに最適な出力形式への変換を行う前に物理的に正確なライティングおよびシェーディングの計算が行われるように設定するものです。

リニアワークフローかガンマワークフローの指定を行うには、
メニューから Edit > Project Settings > Player の順に選択して Player Settings を開いてください。
次に Player Settings ウィンドウで Other Settings を開き、RenderingColor SpaceLinear に設定してください。

色空間の定義は、最終的なシェーディングとライティングに劇的な影響を与えるため、プロジェクトの早期に決定すべき事項のひとつです。

レンダリングモード
サンプルシーン『Spotlight Tunnel』では、デファードレンダリングパスを使用しています。これを使用すると、Unity 2017 以降のバージョンで、複数の動的ライトを効率的に扱ったり、複数のリフレクションキューブマップを組み合わせたりすることができるようになります。また既存のスクリーンスペースリフレクション機能の使用も可能になります。

この設定を行うには、Graphic Settings > Rendering Path or Camera > Rendering Path の順に選択してください。

各種レンダリングモードに関する詳細は、Unity マニュアルのこちらのセクションでお読みいただけます。

高ダイナミックレンジ(HDR)カメラ
現実のようなライティングをレンダーする場合、現実世界とほぼ同様に、1 より高い輝度(HDR)を持つライティング値と放射性(Emissive)サーフェスを扱うことになります。そして、これらの値は画面で表現できる範囲に適切にリマップされなければなりません(これはトーンマッピングと呼ばれます)。この設定は、Unity のカメラがこれらの高い値をクリップせずに処理できるようにするために非常に重要です。

これを有効にするには、シーンのメインカメラを選択し、そのカメラの Inspector タブで HDR にチェックマークを入れてください。

HDR ライトマップ符号化方式(オプション)
サンプルシーン『Spotlight Tunnel』ではベイクしたライティングは使用していませんが、強度の高い(HDR)ベイクしたライティングを使用する場合は、ライトのベイク結果を一貫したものにするために、ライトマップの符号化方式を HDR ライトマップに設定することをお奨めします。
このオプションは、メニューの Edit > Project Settings > Player Settings > Other Settings > Lightmap Encoding にあります(Unity 2017.3 以降のバージョンのみ)。
ライトマップ符号化方式に関する詳細は Unity マニュアルでご覧いただけます。.

シーン用の Tonemapper(ポストプロセッシングスタックの一部)
HDR ライティングを正常に表示するには、プロジェクトで Tonemapper を有効にする必要があります。
アセットストアで入手可能なUnity ポストプロセッシングスタック(バージョン 1)を事前にインストールしてください。

プロジェクト内に Post Process Profile Asset を 1 つ作成し、以下のように設定してください。

  • Color Grading > Tonemapper > ACES を有効にしてください。
    (Academy Color Encoding Standards;アカデミー色符号化仕様)
  • Dithering(ディザリング)を有効にしてください。Dithering によって、HDR シーンからの、各チャンネル 8 ビットの出力によるバンディングアーティファクトの発生が抑制できます。最近のエンジンはこの技術を使用して 1677 万色出力時の制約を回避しています。この時点では、Tonemapper のその他の設定はそのままにしておいてください。
  • 「Main Camera」を選択し、Post Processing Behaviour コンポーネントを追加してください。
  • 上記で作成した Post Process Profile を Profile スロットにアサインしてください。ポストプロセッシングスタックのバージョン 2 を使用したい場合は、パッケージの README をご参照ください(現時点ではベータ版であるため)。
  • ビューポートのイメージエフェクトを有効にしてください。
    これにより、シーンビューでの作業中に常に Tonemapper が確認できるようになります。
    トーンマッピングされたシーンでは、ハイライトの演出と、暗いトンネルの色値の分離が改善されています。トーンマッピングを使用していないシーンでは、ハイライト部分の色が周囲と一体化していないのが確認できます(ここでは、照り付ける太陽光が黄色っぽくなっています)。

この設定は基本的に、露出の固定されたデジタルカメラ(露出調整や眼の調整の機能が有効になっていない状態)でシーンをキャプチャーするのと同じ状況を再現しようとするものです。

ここまでの時点で、幅広いコンテンツで現実のようなビジュアルを表現するための、シーンの基本的なレンダリング設定が完了しました。

ライティングと設定

Unity は、様々なライティング手法、ライティングシステム、プロジェクト条件に幅広く対応しています。Unity マニュアルのライティングモードと設定に関するセクションで、全てのオプションに関する解説をお読みいただけます。

しかし、迅速なイテレーションを簡単に行えるようにするためには、レスポンシブな視覚的フィードバックが欠かせません。
このため、サンプルシーン『Spotlight Tunnel』では、リアルタイムライティングにリアルタイムグローバルイルミネーション(GI)を使用しています。これにより、多彩なスペキュラー反応と質の高い反射光ライティングが得られるようになり、ライトの修正をその場で行えるようになります。

リアルタイム GI とライトプローブを使用したリアルタイムライティング

それでは、ライティングそのものについて見て行きましょう。一般的なシーンの、日中の屋外エリアにおけるライティングは、次の 3 つのライティングコンポーネントに分解することができます。

  1. 半球(空からのライト)
  2. 直接光(太陽や局所的なライト)
  3. 間接イルミネーション(GI ライティング)

ここからは、メッシュにテクスチャが適切に設定され、シーンの組み立てが完了している段階にある想定で話を進めて行きます。

屋外のライティングと設定

半球ライティング
屋外ライティングの最初のコンポーネントは、半球ライティングです。これは Unity では Environment Lighting と呼ばれ、簡単に言うと空の光のことです。夜空が寄与する光は最小となり、日中の空が寄与する光は極めて明るくなります。半球の設定は Lighting タブ内(Window > Lighting > Settings > Environment)で行えます。
最初は、HDRI キューブマップではなくプロシージャルスカイボックスマテリアルから開始するのが賢明です。プロジェクト内で新規マテリアルを作成し、それを SkyMaterial と名付けて、Skybox/Procedural に設定してください。

これを、Lighting タブ > Scene 内にある Environment の Skybox Material にアサインしてください。

シーンにいくらかライティングが施されました。環境光として全体的に照らされていますが、あまり正確な半球ライティングとは言えません。しかし現時点ではこのままにしておきます。

ディレクショナルライト
一般的に、太陽光や月光は、ほぼ無限遠の距離にある 1 つの光源から照射され、ライトの方向もシャドウも平行した状態になります。太陽光や月光は通常、ディレクショナルライトで表現されます。

間接イルミネーション/グローバルイルミネーション(GI)
ディレクショナルライトと環境光だけでは、現実のようなライティングは作れません。しっかりした半球ライティングには空の光のライティングのオクルージョンが必要です。また、物に当たった太陽光の反射もシーン内でシミュレートする必要があります。この時点では、空はシーン全体にひとつの色値をレンダーしているため、均一的な印象になってしまっています。ここで必要となるのが、オクルージョンや間接反射光ライティングの計算を行う、リアルタイムグローバルイルミネーションか、ベイクしたライティングです。これを行うには、下記の手順に従ってください。

  • リアルタイム GI やベイキングに寄与する必要のあるメッシュ全てに、必ず Enable Lightmap Static および Reflection Probe Static のフラグを追加するようにしてください。一般的には、大きな静的メッシュがこれに当たります。
  • 次に、Lighting タブ > Scene > Realtime Lighting で Realtime Global Illumination を有効にしてください(デフォルトの「Medium」の設定のままにしてください)。
  • 「Generate Lighting」を押すか、「Auto Generate」にチェックマークを入れてください。

ライトの生成が完了すると、シーンが暗くなってしまいました!それだけでなく、シーン内の一部の要素が周囲から不自然に浮いた印象になっています。路面電車と背景の扉にご注目ください。
この時点では、シーン内の静的オブジェクトには、半球に対する適切なオクルージョンと、ディレクショナルライトからの間接反射反応がある状態です。しかし、それ以外のオブジェクトには適切なライティング設定がされていません。

ライトプローブとリフレクションプローブ
動的オブジェクトや非ライトマップオブジェクトが、リアルタイムあるいはベイク済のグローバルイルミネーションを受けるためには、シーン内にライトプローブを配置する必要があります。動的にライティングされるオブジェクト(プレイヤーなど)が配置された(または通過する)領域の近くに、効率的にライトプローブグループを分布させてください。ライトプローブグループに関する詳細は、Unity マニュアルのこちらのセクションでご確認いただけます。
「Generate Lighting」を再度押してください。または、「Auto Generate」にチェックマークが入っている場合は、事前計算の完了を待機してください。

路面電車と背景の扉は周囲に溶け込みましたが、反射がまだ不自然な状況です。空の反射がトンネル内にまで表れてしまっています。ここでリフレクションプローブの出番です。必要に応じて適切な範囲にリフレクションプローブを効率的に配置しましょう。上のシーンでは、中央のメインの部屋に 1 つ、各トンネル内部に 2 つずつで事足ります。
一般的な基準としては、キューブマップの解像度(Resolution)を 128 ピクセルに設定してボックスプロジェクション(Box Projection)を使用すれば、反射のベイク時間やメモリの消費を抑えることができます。
リフレクションプローブに関する詳細はこちらをご覧ください。.

ここまでの作業で、シーン全体に自然なまとまりを持たせることはできました。これは現実世界のような説得力のあるシーンを作るためには重要な要素です。しかし、全体的に作業前よりも暗くなってしまい、今のままではまったく説得力のあるビジュアル品質とは言えません。

HDR ライティングの値
半球ライティングと太陽光は、実際には、我々コンテンツ制作者の多くが想像するよりも遥かに明るい光源です。これらの光源の明るさは 1 よりずっと高い値になります。ここで HDR ライティングの出番です。

試しにディレクショナルライトをオフにして SkyMaterial Exposure を 16 に設定してみてください。
こうすることで、適切な半球ライティングがシーンにもたらす影響を確認することができます。

シーンがより現実味をもって見えるようになってきました。これは、太陽光が完全に空で拡散されていて、したがってディレクショナルライトのない、つまり曇りの日と考えてください。

ここで、太陽光を大幅に高い値で再投入してみましょう。まず Intensity を 5 に設定してみます。太陽光がほぼ白く見えていますが、ディレクショナルライトの色は適切に選択することが重要です。なぜなら、強い太陽による間接色の影響で、シーンの見た目が劇的に変わってしまう可能性があるからです。

太陽(ディレクショナルライト)が、現実世界と同じように高エネルギーの光に見えるようになりました。シーンがかなり現実らしさを帯びてきました。

スクリーンスペースアンビエントオクルージョンとスクリーンスペースリフレクション
シーンのライティングはここまででかなり改善されましたが、ディティールを追加することで更にクオリティを上げることができます。通常は、詳細なオクルージョンのベイキングは行うことができません。これは、パフォーマンスを維持するためにリアルタイム GI の解像度に制約が設けられるためです。そこで役立つのが、スクリーンスペースアンビエントオクルージョン(SSAO)です。Ambient Occlusion の下の Post Process Profile 内で SSAO を有効に設定してください。この例では Intensity が 0.5、Radius が 1、Medium Sample count が Downsampling に設定され、Ambient Only にチェックマークを入れてあります。

追加で発生する環境光ライティングのオクルージョンは SSAO が処理してくれますが、反射に関しては、単純なリフレクションプローブのままではなく、精度を向上させる余地がありそうです。
これを行うには、レイトレーシングによるスクリーンスペースリフレクションが役立ちます。ポストプロセスプロファイルで Screen Space Reflection を有効にしてください。

湿った線路の左側では明るい反射がレンダーされなくなっています。これは SSR のおかげで画面上にあるオブジェクトの反射がより正確になったからです。これら 2 つのポストプロセッシングエフェクトは両方ともランタイムでのパフォーマンスコストを発生させますので、必要な場合にのみ有効化し、ご自身のプロジェクトにおけるランタイムパフォーマンスの制約に合わせて画質設定を行ってください。

フォグ
ここまでで、露出の固定された状態で、屋外・屋内の値の分離を行うことで幾分現実的なシーンとなりました。暗い屋内領域では、強いハイライトと深くくすんだ色値によって反射が表現されています。

しかし、深い奥行きを表す要素があるにも関わらず、手前と奥の要素が見えにくくなっています。これに関しては、シーン内に微かなフォグを加えることで大きな変化をもたらし、シーンにより奥行きを持たせることができます。

フォグなしのシーンと比較すると、手前の柵がより鮮明になっています。
フォグは、Lighting タブ > Scene > Other Settings で有効にできます。この例では Fog color が #6D6B4EFF、Density が 0.025 に設定され、Exponential が有効になっています。Unity 2017 のデファードレンダリングでは、自動で有効になっていない場合に、ポストプロセスプロファイル内でもフォグを有効にしなければならない可能性があります。

屋内および局所的ライティング

スポットライトとポイントライト
リアルタイムの局所的ライティングの定番はスポットライトとポイントライトです。エリアライティングは、2018.1 ベータ版で公開された高画質スクリプタブルレンダーパイプライン(HD SRP)を使用している場合以外は、ライティングをベイクする場合にのみ使用可能です。HD SRP モードでは、リアルタイムでレンダー可能な新しいエリアライトが使用できます。

基本的にこれら 2 種類のライトは、空間内の 1 点からライトを照射し、範囲の制限を持っています。スポットライトの場合はこれに角度の制限も加わります。ライティングに関する詳細は、Unity マニュアルの関連セクションをご参照ください。

この 2 種類のライトの大きな相違点は、シャドウの落とし方とクッキーとのインタラクト方法に関連しています。ポイントライトのシャドーイングにはシャドウマップが 6 つ必要ですが、スポットライトの場合は 1 つです。このため、シャドウを落とすポイントライトは大幅にコストが高くなるので、使用は極力控えることが推奨されます。

(注)ベイクされたライトに関しては、この問題はありません。
もうひとつの違いは、スポットライトのクッキーテクスチャ―は単純な 2D テクスチャーであるのに対し、ポイントライトには(通常 3D ソフトウェアで作成される)キューブマップが 1 つ必要になることです。

ライトの色と強度
説得力のある表現を実現するための適切なライトの色と強度の選択は、一定のおおまかなガイドラインに沿って行う必要があります。

屋内のライトの強度を選択する際は、どの屋内ライトにも太陽より高い強度を持たせないようにしてください。屋内ライトが太陽より高い強度を持っていると、シーンによっては見た目のバランスが悪くなります。

例えばこのサンプルシーンの場所でも、日中の明るさを超えるほどの強い光が天井から照らされるような状況はほぼ考えられません。

色を選択する際は、できるだけ、どのカラーチャンネルも完全に除外しない(値を 0 にしない)ようにしてください。除外するとホワイトポイントに達することのできないライトが作られてしまいます。

技術的には使用可能なライトの色ですが、左の画像のライトの色は、最終出力から青色の成分を取り除いてしまいます。シーンの基準となる最終的なカラーパレットを限定的なものにするのはあまり賢明ではありません。後にカラーグレーディングを行いたい場合はなおさらです。

Emissive サーフェス
Unity では、リアルタイム GI やベイクした GI が有効になっていれば、Emissive(放射性の)サーフェスをライティングに寄与させてエリアライティングの効果を表現することができます。これは特に、リアルタイム GI が有効の場合に役立ちます。デベロッパーは、(事前計算が行われれていれば、)Emmisive サーフェスの強度と色を修正したそばから即座にフィードバックを得ることができます。

上の画像では、天井のメッシュから発せられる微かな拡散ライティングが確認できます。

サンプルプロジェクトファイル

Unity サンフランシスコの Spotlight チームは、コンテンツ制作者がハンズオンで学習と実験を行えるように、サンプルシーン『Spotlight Tunnel』を作成しました。

サンプルシーン『Spotlight Tunnel』のプロジェクトファイルはこちらからダウンロードしてください。

プロジェクトをフォルダーに展開し、Unity でプロジェクトを開いてください。

『Spotlight Tunnel』プロジェクトは Unity 2017.1.0f3 を使って作成されています。

Unity 2017.1.0f3 より新しいバージョンの Unity でこのプロジェクトを開く場合は、異なるバージョン間でライティングのデータ形式の互換性がない可能性があるため、ライティングのリビルドが必要となります。

本プロジェクトに含まれるすべてのアセットは、Unity エンジンを使用して開発されたプロジェクト内でのみご使用いただけます。

冒頭でもお伝えした通り、現実のようなビジュアルを作るためには、この他にも理解しなければならない事柄が沢山あります。こちらのチュートリアル(英語)で、本トピックに関して詳しく学ぶことができます。また、Unity マニュアルに完全版ベストプラクティスガイド(英語)も公開予定です。是非お楽しみに!

さあ、限界を超える一歩を踏み出してみませんか?

本記事が、Unity で真に迫るビジュアルの実現を目指すコンテンツ制作者の皆様の役に立てれば嬉しく思います。皆様の素晴らしい作品を拝見できることを楽しみにしています。

2018年3月9日 カテゴリ: Engine & platform | 13 分 で読めます

Is this article helpful for you?

Thank you for your feedback!

取り上げているトピック
関連する投稿