
現実のようなビジュアルの作成
Tutorial
intermediate
+0XP
90 mins
Unity Technologies

サンプルシーン『Spotlight Tunnel』および本チュートリアルは、現実のようなビジュアルのベースラインを設定する際の基礎を学習するためのものです。 プロジェクトのアートコンテンツに合わせて、現実的なビジュアルを持つシーンを Unity で作成する方法を解説していきます。デジタルコンテンツのビジュアルをよりリアルにするには、ライト、テクスチャ―、スケール、マテリアルを相互にバランス良く連携させ、全ての機能をうまく利用していく必要があります。 シンプルな形で学習を進められるように、本チュートリアルは、Unity 独自の機能および一般的なデジタルコンテンツ制作(DCC)ソフトウェアに的を絞った内容となっています。
Resources
Languages available:
1. はじめに
Unity におけるレンダリングの学習を始めるにあたっては、まず、アセットを目的に適した形式にする必要があります。デジタルコンテンツ制作(DCC)ツールから Unity へのワークフローを適切に設定することが非常に重要です。使用可能な DCC ツールは数多くありますので、それぞれにおけるエクスポート手順の説明は省きますが、以下に挙げるいくつかの点を考慮する必要があります。
尺度(スケール)と単位(ユニット)
尺度(スケール)と測定単位(ユニット)は、現実のようなシーンを作る上で非常に重要な役割を果たします。 リアリスティックなビジュアルを目指す作品の場合、一般的には 1 Unity ユニット = 1m(100cm)と想定することが推奨されます。多くの物理システムの単位のサイズがこの想定になっているからです。
DCC 3D ソフトウェア から Unity へインポートする際の単位の変換
DCC 3D ソフトウェアと Unity との間で整合性を維持するには、インポートされたオブジェクトのスケールとサイズの検証を必ず行うことが推奨されます。3ds Max、Maya、Blender、Houdini などの DCC 3D ソフトウェアでは、FBX エクスポート設定の中でユニットとスケールの設定を行えます(各ソフトウェアのマニュアルを参照してください)。 一般的には、ツールの設定は「作業は cm で行って自動スケールで FBX をエクスポートする」という形にすれば、Unity インポートのスケールと適合します。 ただし、より確実にするには、プロジェクトの開始時に毎回、適合しているかどうか確認することをお勧めします。エクスポートの設定をテストするには、DCC 3D ソフトウェア内で 1x1x1m の単純なキューブを作成し、それを Unity にインポートします。 Unity の初期設定のキューブ(GameObject > 3D Object > Cube)は 1x1x1m ですので、インポート済モデルとの比較が行いやすく、簡単にスケール検証ができます。
Unity インスペクターの Transform コンポーネント内でスケールが 1,1,1 に設定されていれば、これらのキューブは全く同じように表示されるはずです。注意
- Maya と 3DsMax は、デフォルトの単位を前回開いたファイルによってオーバーライドすることができます。
3D ソフトウェアでは、内部的に設定された単位とは別の単位をワークスペース上で表示することが可能です。これにより多少の混乱が生じることがあります。
こちらの画像は 3ds Max の例です。
スケール基準モデル
プレースホルダーや仮のジオメトリを使ってざっくりシーンを組み上げる時に、スケールの基準として使用できるモデルがあると役立ちます。作成するシーンに合った(関連した)何かの要素を、スケール基準モデルに選んでください。サンプルシーン『Spotlight Tunnel』の場合、汎用のベンチがスケール基準モデルとして選択されています。これは、シーン内の要素を完全に現実世界と同じサイズ比率にしなければならないということではありません。独特のサイズ比率を持つシーンであっても、オブジェクト間の相対的なスケールに一貫性を持たせるために基準モデルを設定すると良いです。
テクスチャの出力とチャンネル
3D ソフトウェアと Unity との間における単位の変換に一貫性が求められるだけでなく、テクスチャ内部の情報も正確でなければ、それがマテリアルに追加された時に正しい結果が得られません。下の画像は、Substance Painter の(Unity 標準の不透明マテリアルに使用される)テクスチャ出力のプリセット設定の一例です。
Unity 標準マテリアル内におけるテクスチャの割り当て
- $textureSet_Albedo ― Albedo スロットにアサインされます。
- $textureSet_MetallicAOGloss ― Metallic と Occlusion にアサインされます。 Smoothness Source は Metallic Alpha に設定されます。
- $textureSet_Normal ― Normal Map スロットにアサインされます。
(注)複数のチャンネルを Metallic、AO、Gloss などの単一のテクスチャに含めると、アンビエントオクルージョン(AO)を別のテクスチャとしてエクスポートした場合よりもテクスチャメモリを節約できます。Unity の標準マテリアルを扱う場合、これが一般的な方法です。Photoshop や Substance Painter などのテクスチャ作成ソフトウェアは、一貫性のあるテクスチャを適切な設定で出力します。ただし場合によっては、(主にアルファチャンネルを扱う場合に)コンテンツ制作者にとって紛らわしい状況になる場合もあります。以下の画像は、PNG の「透過性(Transparency)」が Photoshop を使っている人にとって混乱を招きやすいことを示す例です。これは Photoshop で外部プラグインなしで PNG 画像のアルファを扱うときに使われるネイティブの処理方式に起因しています。 この場合、(ソースのテクスチャファイルのサイズに問題がなければ)専用アルファチャンネルを持つ非圧縮の 32 Bits TGA の方が適しているかもしれません。
上の画像の中で、Photoshop で作成された「透明な」 PNG では、アルファが黒として表示されていますが、専用のアルファチャンネルを持つ TGA は期待通りの値を表示します。アルファチャンネルをスムースネスとして読み出す標準マテリアルに各テクスチャをアサインした場合、PNG テクスチャを持つマテリアルのスムースネスは反転してしまい、TGA テクスチャを持つマテリアルは期待通りに表示されます。
法線マップの方向
Unity は接線の法線マップを以下の解釈で読み出します。 赤チャンネル X+ は「右」、緑チャンネル Y+ は「上」(OpenGL 方式)例えば 3ds Max の「Render to Texture」法線マップは、デフォルトでは緑チャンネルの Y+ を「下」として出力します。これはサーフェスの方向を Y 軸上で反転させ、光を当てた時に不正確な結果を生じさせます。
法線マップの方向を検証するには、傾斜状のくぼみのある単純な面(上の中央の画像)を 1 つ作成し、それを平らな面にベイクします。次に Unity で、確認しやすい方向のライトを付けて、そのベイクされた法線マップを平面にアサインし、軸のどれかが反転していないかどうか確認してください。軸の適切な設定方法に関しては、デジタルコンテンツ制作ソフトウェアのマニュアルをご参照ください。
2. Unity のレンダリング設定を準備する
以下の解説は、現実のようなビジュアルの実現に焦点をあてたものです。現実世界をリアリスティックに再現するためには Unity のレンダリング機能をどのように使用したら良いかを理解することで目的のビジュアルへの実現に一歩近づきます。 より踏み込んだ情報は、Unity のライティングとレンダリングに関するチュートリアル(英語)をご利用ください。
リニアレンダリングモード
モニターに最適な出力形式への変換を行う前に物理的に正確なライティングおよびシェーディングの計算が行われるように設定するものです。リニアワークフローかガンマワークフローの指定を行うには、 メニューから Edit > Project Settings > Player の順に選択して Player Settings を開いてください。 次に Player Settings ウィンドウで Other Settings を開き、Rendering の Color Space を Linear に変更してください。色空間の定義は、最終的なシェーディングとライティングに強い影響を与えるため、プロジェクトの早期に決定すべき事のひとつです。 各ワークフローの説明は Unity マニュアルでお読みただけます。
レンダリングモード
サンプルシーン『Spotlight Tunnel』内では、ディファ―ドレンダリングモードが使用されています。 これを使用すると、Unity 2017 以降のバージョンで、複数の動的ライトを効率的に扱ったり、複数のリフレクションキューブマップを組み合わせたりすることができるようになります。また既存のスクリーンスペースリフレクション機能の使用も可能になります。この設定を行うには、Project Settings > Graphic か、GameObject > Camera を選択して表示されるインスペクターの中から、Rendering Path の値を使用するレンダリングモードに合わせた値に設定します。各種レンダリングモードに関する詳細は、Unity マニュアルの こちらのセクション でお読みいただけます。
高ダイナミックレンジ(HDR)カメラ
現実のようなライティングをレンダリングする場合、現実世界とほぼ同様に、1 より高い輝度(HDR)を持つライティング値と放射性(Emissive)サーフェスを扱うことになります。そして、これらの値は画面で表現できる範囲に適切にリマップされなければなりません(これはトーンマッピングと呼ばれます)。この設定は、Unity のカメラがこれらの高い値をクリップせずに処理できるようにするために非常に重要です。 有効にするには、シーンのメインカメラを選択し、そのカメラのインスペクターで HDR にチェックマークを入れてください。
HDR ライトマップ符号化方式(オプション)
サンプルシーン『Spotlight Tunnel』ではベイクしたライティングは使用していませんが、強度の高い(HDR)ベイクしたライティングを使用する場合は、ライトのベイク結果を一貫したものにするために、ライトマップの符号化方式を HDR ライトマップに設定することをおすすめします。 このオプションは、メニューの Edit > Project Settings > Player Settings > Other Settings > Lightmap Encoding にあります(Unity 2017.3 以降のバージョンのみ)。 ライトマップ符号化方式に関する詳細は Unity マニュアルでご覧いただけます。
シーン用 の Tonemapper
HDR ライティングを正常に表示するには、プロジェクトで Tonemapper を有効にする必要があります。 アセットストアで入手可能な Unity ポストプロセッシングスタックを事前にインストールしてください。ポストプロセッシングスタック(バージョン 1)( サンプルシーン『Spotlight Tunnel』で使用されているバージョン)のセットアップを以下の手順で行ってください。
- プロジェクト内に 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 が確認できるようになります。
トーンマッピングされたシーンでは、ハイライトの演出と、暗いトンネルの色値の分離が改善されています。トーンマッピングを使用していないシーンでは、ハイライト部分の色が周囲と一体化していないのが確認できます(ここでは、照り付ける太陽光が黄色っぽくなっています)。
この設定は基本的に、露出の固定されたデジタルカメラ(露出調整や眼の調整の機能が有効になっていない状態)でシーンをキャプチャーするのと同じ状況を再現しようとするものです。
ここまでの時点で、幅広いコンテンツで現実のようなビジュアルを表現するための、シーンの基本的なレンダリング設定が完了しました。
3. ライティングの方法
最終的なアセットの作成とシーンのライティングを開始する前に、ライティングの方法を考える必要があります。素晴らしい作品を作る意欲に満ちたコンテンツ制作者が、プロジェクトの開始時にこの重要なステップを飛ばしてしまうことは良くあります。開発が進んでからライティングの方法を変更するには非常に高いコストが掛かります。制作に入る前にしっかり時間を掛けて方法を固めることで、結果的に時間が節約され、より良いパフォーマンスと、より忠実性の高いビジュアルを実現することができます。
現実世界の様々な事柄についても同じことが言えますが、二つの異なるセットアップのメリットとコストを比較した場合、そこにはほぼ必ずトレードオフがあります。F1 レース用の車は、燃料節約型のハイブリッド車と比べると、日常の食料の買い出しには適していないのと同じことです。しかし、特定の条件下でこういったトレードオフを緩和することのできる技術も存在します。各機能とそのトレードオフを把握することで、プロジェクトに何が最も適しているかを判断できるようになります。
それでは、ライティングそのものについて見て行きましょう。一般的なシーンの、日中の屋外エリアにおけるライティングは、次の 3 つのライティングコンポーネントに分解することができます。
- 半球(空からの光)
- 直接光(太陽や局所的な光)
- 間接光(反射した光)
これだけだと単純な 3 つのコンポーネントがあるだけのように思えますが、リアルタイムライト、混合ライト、ベイクされたライト、静的オブジェクト、動的オブジェクトの選択と組み合わせによって、多種多様なライティングを生み出すことができます。Unity は様々なライティング手法やプロジェクト条件に幅広く対応しています。各種ライティングモードおよびセットアップに関する詳細は、Unity マニュアルでご確認いただけます。Unity を使い始めて間もない方にとっては、全てのセットアップのトレードオフを把握して選択するのは大変かもしれません。そこで、膨大な情報の中から、最も一般的に使用されているセットアップに的を絞って確認して行きましょう。最も一般的に使用されているライティングのセットアップは以下の 5 つです。
各セットアップの見え方の違いを確認できる画像です。
- Basic Realtime(ベーシックなリアルタイムライティング) ― ライトからのスペキュラーハイライトは目に見える形で表れますが、間接ライティングが表れません。
- Baked(ベイクされたライト) ― ベイクされたソフトシャドウが現れ、静的な間接ライティングが高解像度で現れますが、ライトからのスペキュラー反応はなく、動的に照らされたオブジェクトはシャドウを落としません。
- Mixed(混合ライティング) ― Baked と類似していますが、スペキュラー反応があり、動的に照らされたオブジェクトがシャドウを落とします。
- Realtime ライトと GI ― 正常な間接ライティング反応とスペキュラー反応が表れ、全てのライトが可動で更新可能ですが、斜めに差すソフトシャドウはありません。
- Guns Blazing(全オプションを有効にした状態) ― 各ライトの設定によって、上記のオプションを全て組み合わせることができます。
上のスライドショーは、ベイクされたアンビエントオクルージョンが有効になった状態です。 (注)リアルタイム GI は静的なアンビエントオクルージョンをベイクできないので含まれていません。各設定の基本的な特徴は以下の通りです。
ベーシックなリアルタイムライティング + 環境光ライティング(リアルタイム GI やベイクされた GI は無し)
代表的なターゲットプラットフォーム ― 据え置き機と PC
一般的に、様式化されたビジュアルを持つプロジェクトや、プロトタイプの段階に使用されます。
メリット
- 直接光と直接シャドウは全てリアルタイムであり、したがって動的です。
- 事前計算もなく、ベイキングやメッシュの準備もないため、イテレーションが速くなります。
- 動的オブジェクトと静的オブジェクトが同じ方法で照らされ、ライトプローブが不要です。
デメリット
- 半球オクルージョンがなく、直接光によって照らされてていない領域では、そのままのスカイボックス / アンビエントの色と値になります。
- グローバルイルミネーション(GI) / 間接ライティングのコンポーネントがなければ、結果的に最善のビジュアルが得られない可能性があります。
全ライティングをベイク + ライトプローブ
代表的なターゲットプラットフォーム ― モバイルプラットフォーム、VR、据え置き機、低性能 PC
一般的に、トップダウンのアイソメトリック・モバイルゲームや高フレームレートの VR ゲームなど、ランタイムのパフォーマンスが課題になりますが、メモリに余裕のあるゲームに使用されます。
メリット
- 静的オブジェクトには全てのライトがベイクされます。アンビエントオクルージョンと間接ライティングを生成します。
- エリアライトのベイキングに対応しており、ソフトシャドウの角度を静的に照らされたオブジェクトにベイクできます。
- ここにリストアップされている中で、ランタイムのパフォーマンスが最も速くなるオプションです。
デメリット
- ライティングがベイクされているためライティングのイテレーションが遅くなる場合があります。したがって、プログレッシブライトマッパーが使用されていない場合には、シーン変更時にライトのリビルドが必要になります。
- 動的に照らされるオブジェクトは、ライトプローブによってのみ照らされます。
- 光源からのスペキュラーハイライトがなく、キューブマップ / 反射にのみ依存します。
- 動的オブジェクトからのシャドーイングはありません。
- シーン内に使用されているライトマップテクスチャの量によっては、ランタイムメモリのコストが大きくなる可能性があります。
- テクスチャコーディネートチャンネル 2(ライトマップの UV2)の作成が必要になる場合があります。
混合ライティングとシャドウマスク + ライトプローブ
代表的なターゲットプラットフォーム ― VR、据え置き機、PC
一般的に、据え置き機や PC 向けゲームで、日中の光の時間(太陽の動きなど)が重要でないものでは、ほとんどこれが使用されています。
メリット
- 全ライティングをベイクした場合と類似していますが、混合ライティングでは、動的オブジェクトがリアルタイムのスペキュラー反射を受けてリアルタイムシャドウを落とし、静的オブジェクトはベイクされたシャドウマスクを受け、結果としてビジュアル品質が高くなります。
デメリット
- オブジェクトが持てるシャドウマスクの数が 4 つに制限されます。
- ランタイムのパフォーマンスに、リアルタイムライトのレンダリングによる付加的なコストが掛かります。
- 混合ライトの使用には注意してください。特定のセットアップでパフォーマンスに最悪な影響を与える可能性があるためです。
上記のリストは、シャドウマスクライティングをごく簡略的に説明したものです。 完全な情報はこちらでご確認いただけます。
リアルタイムライティングとリアルタイム GI + ライトプローブ
代表的なターゲットプラットフォーム ― 据え置き機、PC
一般的にオープンワールドゲーム(日中の光の時間の更新が必要で、ゲームデザインの一部として動的ライティングの効果が必要)に使用されます。
メリット
- リアルタイムの間接ライティングを使用した素早いライティングのイテレーションが可能です。
- 動的オブジェクト・静的オブジェクトの両方がリアルタイムのスペキュラー反射およびシャドウを受けます。
- 間接ライティングの効果を出すのに、ベイクされたライティングよりも少ないメモリ消費で済む場合があります。
- GI の更新に掛かる CPU 時間のパフォーマンスコストが一定です。
デメリット
- ベイクされたライティングよりオクルージョンの詳細度が低く、通常、スクリーンスペース・アンビエントオクルージョン(SSAO)および、各オブジェクトのテクスチャにベイクされたアンビエントオクルージョン(AO)によって補強される必要があります。
- 静的オブジェクトがエリアシャドウや角度の付いたライトのソフトシャドウを受けません。
- リアルタイムライトは、設定によってはパフォーマンスに最悪な影響を与える可能性があるため、使用には注意してください。
- 静的ライティングに寄与するオブジェクトの量が多すぎる場合に、事前計算(ライティングの生成)に大幅に時間が掛かる可能性があります。UV の設定が最適化されていない場合は特にこれが当てはまります(Enlighten のリアルタイム GI でさらに最適化やプロジェクションの修正を行う場合は、テクスチャコーディネイトチャンネル 3(UV3)の作成が必要になります)。
リアルタイム GI の最適化に関する詳細はこちらでご覧いただけます(英語)。
Guns Blazing(全てのオプションを有効にした状態)
代表的なターゲットプラットフォーム ― 据え置き機、PC
一般的に、高い現実性が求められ、パフォーマンスに制約があってメモリの使用を厳密に管理する必要のあるゲームに使用されます。このオプションは、コンテンツ作成者が個々のシステムを熟知していて、ライティングの各組み合わせの性質を深く理解して扱える場合に使用することが推奨されます。
メリット
- 全てのライティング機能が揃ったオプションです。コンテンツ作成者は全機能を利用することができます。
デメリット
- ランタイムのパフォーマンスとメモリを完全に消費してしまう可能性があります。
- ワークフローの負荷(UV 作成およびベイク時間)が増加します。
迅速にイテレーションを行ったりシーンのライティング状況を確認したりするためには、レスポンシブな視覚的フィードバックが欠かせません。このためサンプルシーン『Spotlight Tunnel』では、リアルタイムライティングとリアルタイム GI を併用しています。 これにより多彩なスペキュラー反応と質の高い反射光ライティングが得られ、ライトの修正をその場で行えるようになっています。
4. モデリング
コンテンツ制作者が犯しやすいミスのひとつは、モデリングを行う前に先を見据えて計画を立てないことです。試作段階や大まかな下書きの段階で大雑把なモデリングを行うのは問題ありませんが、アセットをある程度完成版に近い状態しなければならない段階に来たら、事前に考えなければならないことがいくつか出てきます。 以下に、(経験を積んだコンテンツ制作者でも見逃してしまうことがある)シーンの適切なモデリングのために覚えておくべき事をいくつかご紹介します。
ポリゴンを無駄に含めないようにしましょう。 プロジェクト開発の全ての要素について当てはまることですが、できるだけシンプルにすることが大切です。モダンなハードウェアが今までになく高性能になっているとは言え、ジオメトリをシンプルにすることはシーンの作成において非常に大切です。不要なテッセレーションや複雑なジオメトリは、リアルタイムでのコストパフォーマンス面での管理を困難にし、メモリを必要以上に消費するので、逆効果になりかねません。
上の画像の例では、プレイヤーが見ることのないジオメトリが、ライトマップやオーバードローなどのためにリソース(資源)を浪費し、最悪の場合、光漏れを引き起こす可能性もあります。
- モデリングの規則をジオメトリのライティングのモードに基づいて定めましょう。 ベイクされたライティングやリアルタイムグローバルイルミネーションをライトプローブと併用する場合は、モデルがシーン内で間接ライティングやベイクされたライティングに寄与するようにするか、あるいはそれらを受けるのみで寄与しないようにするか、決定する必要があります。
- ライティングに寄与させたいオブジェクトの場合 (インスペクターで Lightmap Static にチェックマークが入った状態) サーフェス領域がよりシンプルで滑らかであるほど、ライトマップテクスチャ内でより効率的にスペースが使用されるため、生み出される間接反射 / ベイクされたライティングの質が高くなります。 自動ライトマップ UV が非効率的なチャートを生成したり不要なシームを生成する場合は、ライトをベイクする際にジオメトリ用の UV2 の作成が必要になる場合があります。 リアルタイム GI で効率的な結果を得るために、ジオメトリ用の UV3 の作成が必要になる場合があります。リアルタイム GI の場合、メッシュの UV を単純化することで、ジオメトリが使用するリソースの量が大幅に削減され、アーティファクトの少ない、より質の高い結果を得られる可能性があります。
- 動的ライトとライトプローブのライティングのみを受けるオブジェクトの場合、ジオメトリにライトマップ UV の制約が掛かりません。大きなジオメトリに関しては、単一のプローブでは正常に照らせない場合があり、複数のプローブのライトの定義を連携させるために Light Probe Proxy Volumes(LPPV)が必要となる可能性があるため、やはり特別な注意が必要です。 詳細は Unity マニュアルの LPPV ガイドをご覧ください。
動かないオブジェクトであっても、必ずしもライトマップで照らしたり、リアルタイム GI に寄与させる必要はありません。習慣的に全ての静的オブジェクトを静的ライトマップに含めてしまいがちですが、小さなオブジェクトや、大量のライトを反射するサーフェスを持たないオブジェクトは、通常はライトマップに含める必要はありません。下の画像のベンチと線路がその例です。
- モデルの UV レイアウトの方法 特にタイル化できないテクスチャを持つジオメトリの場合、法線マップのベイキング(一般的に UV1)やライトマップのベイキング(UV2)やリアルタイムライトマップ(UV3)に掛かるメモリコストを変えずに、UV レイアウトによってビジュアル品質を向上させることが可能です。
以下に、UV レイアウトに関するヒントをいくつかご紹介します。
- UV1 チャートの分割は必要な場合にのみ行い、法線マップのベイキング用のテクスチャスペースを無駄にしないようにして、できるだけ効率的にUV チャートをレイアウトしてください。例えば、1024 ピクセルの正方形テクスチャは、ディテールを配置してもしなくても同じ量のメモリを使用します。
上の画像の例では、テクスチャのピースをテクスチャスペース全体を敷き詰めるように並べることで、スペースの無駄が回避されています。
ライトマップ(UV2)に関しては、連続した(切れ目のない)チャートにすることで、ライトベイカー内のシームを回避してください。ブリーディングを回避するため、ライトマップ UV チャートは重なることがないようにしてください。ライトマップのテクセルをモデル全体に均一に配分するためには、UV チャート / シェルの間でスケールの整合性を保つことが重要です。
上の画像はライトマップのシームの問題を誇張して示したものです。ライトマップが単純なジオメトリ上で分断されています。
- リアルタイム GI(UV3)に関しては、モデル内で大きなサーフェスを表す領域の UV スペースをできるだけ優先することで、メモリの使用量を抑えてシームを回避してください。多くの場合は、モデル内の自動 UV 設定を使用するとチャートの最適化に非常に効果的です。 リアルタイム GI 用のチャートの最適化に関する詳細はこちらでご覧いだだけます(英語)。
- ライトマップの必要ないオブジェクトの場合は、(カスタムシェーダーによって必要とされる場合以外は)上記のような付加的な UV の作成によってメモリと時間を無駄にしないようにしましょう。
ジオメトリのディテール 現実世界にある物体(オブジェクト)は非常に詳細に出来ています。ディテール(詳細)をジオメトリに配置するか、法線マップとテクスチャで表現するかの判断は、リアルタイムのジオメトリ作成における基本的なステップです。リアルタイムシーン用のアセットの開発で最近一般的に使用されているのは、ハイポリゴンからローポリゴン化して法線マップをベイキングする手法です。
重要なディテールでミスの起こりやすいもののひとつは、オブジェクトのエッジにおける、ハイライトの受け方です。現実世界の物体で、極度に鋭いエッジや面取りが全くないエッジ、あるいはエッジの輪郭にディテールがないオブジェクトというのはほぼ存在しません。この現象を再現することでシーンのリアリティが向上します。
サーフェスがジオメトリに接触する部分に、滑らかで質の良いハイライトが得られます。
- スムージンググループ(ポリゴンのハードエッジとソフトエッジ) スムージンググループの適切な使用によって、モデルと法線マップの効率性を高めることができます。
ハイポリゴンからローポリゴン化して法線マップをベイキングする場合は、多面ポリゴンよりも、シンプルな構造のスムージンググループの方が推奨されます。これはなぜかというと、接線法線マップによって、ローポリゴンのジオメトリのサーフェス法線にできる尖った部分を丸める必要があるためです。
上の画像では、法線マップがローポリゴンの法線を滑らかに曲げ、ハイポリゴンメッシュのように見せています。
しっかりした法線マップを持つ滑らかなポリゴンは、頂点数の節約にも繋がり、したがってレンダーにとってもより効率的なジオメトリを構成します。下図に示した簡単な例は、1 つのスムージンググループ内に 18 個の単純な三角形の面を含めると頂点数が 16 個になるのに対し、単一の面ごとにスムージンググループを分割した場合、三角形は同じ 18 個でも頂点数が 36 になることを示しています。
- 滑らかなポリゴンを使用すると、ライトマップのベイキングとリアルタイム GI におけるチャートの分割を抑制することもでき、結果としてビジュアルがより滑らかになります。
上記のリストは 3D オブジェクトやシーンのモデリングの完全なプロセスを網羅するものではありませんが、どんな点に注意すべきか理解するための一助となれば幸いです。
5. スタンダードシェーダー/スタンダードマテリアルの PBS とテクスチャリング
マテリアルは、ライトがモデルのサーフェスに対してどのように反応するかを定義するものであり、現実のようなビジュアルの作成には欠かせない要素のひとつです。モデルが作成されたら、そのサーフェスのプロパティの定義を行います。
物理ベースレンダリングシェーダー(PBS)の革新は、リアルタイムレンダリングに劇的な進化をもたらしました。法線マップの革新以来、現実のようなビジュアルの実現にこれほどまでに寄与したものはありません。 Unity のスタンダードシェーダーは、リアリスティックなマテリアルを簡単に作成できる優秀なシェーダーです。ShaderLab や ShaderGraph(スクリプタブルレンダーパイプライン)その他のサードパーティー製シェーダー作成ツールの作成を開始する前に、まずはスタンダードシェーダーを使いこなせるようにすることを強くお勧めします。
Unity のスタンダードシェーダーに関する詳細は、こちらでご確認いただけます。
PBS を使用すると説得力のあるマテリアルが作成できますが、マテリアルのスライダーとカラーピッカーを調整するだけではより良い結果は得られません。現実世界に存在するサーフェス(面)のほとんどは複数のマテリアルで成り立っています。 Unity の標準マテリアルでオブジェクトのテクスチャリングを行う場合に、思い通りの結果を得るために考えるべき事柄をいくつかご紹介します。できるだけ簡潔にするために、ここではアルベド、スムースネス、法線マップ、アンビエントオクルージョンのみに的を絞ってご紹介します。
- Standard と Standard Specular Unity では標準マテリアル内に 2 つのオプションがあります。Standard と Standard Specular です。この 2 つのマテリアルについては、以下を念頭に置いてください。
- 基本的には、Standard に設定されたマテリアルを Specular の輝度として使用する方が簡単で、色はアルベド、スムースネス、Metallic の入力に応じて自動的に計算されます。
Standard のマテリアル内の Metallic の値が 1 である場合、サーフェスの輝度・光沢度を調整するスムースネスとアルベドとの組み合わせによって、スペキュラー反射の色とその輝度が決まります。
Metallic の値が 0 である場合、アルベド色はスペキュラー反射の色に影響を与えず、サーフェスの色として表れます。
- マテリアルのアルベドから来るスペキュラー反射の色を切り離したい場合は Standard Specular シェーダーを使用してください。これは派手な色のマテリアルに適用できます。
- アルベド値とマテリアルバリデーター 物理ベースシェーダーはリソースを効率的に節約するために機能します(ライトからスペキュラー反射の輝度と分布を自動的に計算する)が、マテリアルのアルベドはリアリスティックである必要があります。マテリアルのアルベドは、直接ライティングと間接ライティングとの両方に影響し、非現実的な値はシーンのその他のライティングにも連鎖的に影響を与えます。
非常に暗いアルベドはライトを大量に吸収してライティングに対する不自然な反応を発生させます。明る過ぎるアルベドは、通常現実世界では見られないようなライトや間接色を大量に反射します。
上の画像の例では、非金属サーフェスのアルベドが間接ライティングに影響を与えているのが確認できます。
- 開発者が PBS の値を決定するために参照できるチャートはありますが、現実世界にごく一般的に存在する非金属の塗装が施された面のための定義された値はありません。例えばコンテンツ制作者が、木製の壁を炭のような黒や雪のような白でペイントすることを決めたとします。その壁のアルベドを決める時、コンテンツ制作者の好み以外には、絶対的に定められたひとつの値というものは存在しません。 ここで、基本的なガイドラインが役に立ちます。非金属の、ペイントされたサーフェスの場合には、アルベドの値が 0.2 より低ければ暗過ぎで、0.8 より高ければ明る過ぎると考えればほぼ確実です。これは科学的な測定に基づくものではありませんが、簡単に覚えられるガイドラインとして役立ちます。適切な PBS 値のチャートはこちらでご覧いただけます。
暗い色の誘電性のマテリアルに関する情報は、こちらの専門的なガイド(英語)をご覧ください。チャートは、単一のアルベドサーフェスを扱う場合には簡単に利用できますが、複雑なアルベドテクスチャの検証は困難な場合があります。これに対応すべく、Spotlight チームのレンダリングエンジニアがマテリアル検証ツールを開発しました。このツールを使用すると、マテリアルの値がガイドラインに沿っているかどうか確認することができます。このツールはシーンのビューポート内で有効化できます。「Shaded」から 「Material Validation」ビューに切り替えてください。
- Metallic の値 マテリアルの Metal(金属)値は、サーフェスに環境がどこまで反射されるか、またサーフェス上にアルベド色がどの程度表示されるかを定義します。サーフェスが純粋なMetal である場合、サーフェスの色(アルベド)が環境反射の色を制御します。Metal マテリアルに関しては、以下の事項に注意してください。
光沢を持つ純粋な金属のマテリアルは拡散ライティングを反射しません。部屋全体が金属で出来ている場合、その部屋は非常に暗くなり、スペキュラーハイライトとリフレクションのみが見える状態になります。
上の画像は、ポイントライトが全体的に照射される滑らかな金属でできた部屋がどの程度暗くなるかを示すものです。
特定のサーフェスを金属にするかどうかの判断は、時として悩ましい問題です。オブジェクトそのもののマテリアルのみに気を取られずに、オブジェクトの最終的なサーフェスに注目してください。 例えば、青く「ペイント」された金属の柵の場合、塗装のない領域のみが Metal として指定されるべきです。下の画像は、塗装された金属の柵がどのようにテクスチャリングされるべきかを示しています。
(注)金属バーの塗装の剥がれた領域は金属光沢を持ちますが、錆は金属のサーフェスではありません。
- マテリアルに必要な Metallic 値は 0 か 1 のどちらかだけであると思ってしまいがちですが、サーフェスのマテリアルが混合されたりブレンドされている場合もあります。例えば、部分的に埃や泥に覆われた Metal オブジェクトの Metallic 値は、ブレンドすることで中間の値になります。ただしそういった場合以外でリアリスティックなマテリアルを作成する際には、0 と 1 の中間の Metallic 値は使用しないように十分注意してください。
- Smoothness の値 Smoothness(スムースネス/滑らかさ)はサーフェスの詳細なディテールを制御します。値が 1 であれば純粋な反射鏡のようなサーフェスになり、値が 0 であれば極度に粗く、くすんだサーフェスになります。これは通常は分かりやすく直感的に扱えますが、場合によっては非常にややこしい状況になることもあります。 以下の事項に注意してください。
- オブジェクトの最終的なサーフェス(表面)の質に注目してください。オブジェクトがコンクリートで出来ているからと言って、それだけではスムースネスの値は全く判断できません。粗い表面のコンクリートに光沢塗料が塗られているものかもしれません。塗装されていない木材などもこの一例です。木材がどの程度研磨されているかによって、最終的なスムースネスの値が変わってきます。
- 擦り傷、泥、引っ掻き傷、水染みも忘れないでください。現実世界では、マテリアルの表面は様々な可変要素に影響を受けるため、純粋な単一のサーフェスであることは稀です。
要素が各サーフェス間でどのようにブレンドされるかによって、マテリアルの性質も決まってきます。([例]土の上の水溜まりの場合、通常は単純にスムースネスをブレンドしただけではなく、吸収された水の作る輪によってアルベドを暗くします)。
法線マップ 「法線マップ」とは通常、ライトが別の方向から来ているかのようにポリゴンのサーフェス法線を屈曲させる、接空間の法線マップのことを指します。コンテンツ制作者は通常これを、見た目が単純なメッシュに多数のディテールを追加するために使用します。 法線マップは通常ジオメトリのディテールを追加するために使用されますが、マテリアルを定義する役割も持っていることを忘れないでください。法線マップを使って元々のサーフェスマテリアルを表示することができます。下の画像の、光沢度の高い赤い塗装の施された木材がその一例です。
オクルージョンマップ オクルージョンマップは環境光ライトの減衰を模倣し、凹面などの形状の見え方を向上させることができます。
既に、ライトのベイキングや間接ライティングやスクリーンスペースアンビエントオクルージョン(SSAO)が選択肢としてありますが、なぜこれが必要なのでしょうか?その理由は 2 つにあります。
- (特に詳細度の高いモデルのデータを持っている場合は)オフラインレンダリング中に非常に高品質の(環境光の減衰をよく近似する)オクルージョンマップを生成することができるため(詳細度の高いモデルを詳細度の低いモデルに変換するときに法線マップをベイキングするのに似ています)。
- オクルージョンマップは、動的に照らされたオブジェクトに非常に役立ちます。動的オブジェクトはライトのベイキングからのオクルージョンは受けず、ライトプローブ、環境光ライティング、低詳細のスクリーンスペースアンビエントオクルージョン(SSAO)のみを受けるからです。
- 参考画像、カラーチャートおよびソース写真 デジタルコンテンツ制作に限らず、どんな分野に挑むときでもその背後にある基本的な原理を学ぶことがより良い結果に繋がります。マテリアルの制作に関して言えば、物体の表面の写真をたくさん撮って自分の引き出しを増やすのはいい学びになりますし、撮った写真を参考にしたり、そのままテクスチャのソースとして使うことで、DCC ツールでのサーフェスマテリアルの作成をスピードアップさせることもできます。 特定の素材の写真を数多く撮るという以外に、参考用画像の収集に関するルールというものは特にありません。何かの画像を参照したい場合に画像検索エンジンを使用するのと同じことです。
一方、テクスチャのソース用に写真を撮り、それと同様のビジュアルを DCC で作成していく場合、テクスチャのキャプチャリングに関するいくつかのガイドラインがあります。以下の項目を確認してください。
カラーキャストを除去し、サーフェスに表れるライトの輝度の影響を打ち消すことが大切です。ホワイトバランスの調整と、(Kodak R-27 カードなどの)18% グレーカードの適切な露出を利用してください。
18% グレーカードはテクスチャのソース写真を撮る際のアンカーとして一般的に使用されており、信頼されている値です。独自の 18% グレーカードをプリントすると大抵の場合は不正確なカードとなり、色のバランスも悪くなるのでお勧めできません。 正確な 18% グレイカードは RGB(124,124,124)あるいは sRGB 色空間の #7C7C7C に相当します。カメラはこのグレイカードを使って、(ライトの輝度を打ち消すことで)適切な露出に調整し、(光のカラーキャストを除去することで)ホワイトバランスを調整します。 グレイカードに関する詳細はこちらをご参照ください(英語)。
デジタル一眼レフや高性能カメラを使用するに越したことはありませんが、必須ではありません。携帯電話のカメラなどでも、手動での露出制御と RAW 撮影が可能なカメラであれば、上記の方法で良い結果が得られます。
更に、X-Rite ColorChecker でプロファイルされた RAW 画像に偏光ライティングとレンズを用いれば、より精度の高いアルベドテクスチャがキャプチャーできます。
R-27 グレイカード同様、ColorChecker チャートも色の参照用に一般的に信頼されており、アンカーとして使用できます。カメラセンサー、レンズ、フィルター、およびライティング条件の特性のプロファイルが生成可能で、これを RAW 画像の修正に使用することができます。
- テクスチャソースをキャプチャーする時のライティングは、曇りの日や、光の加減が均一な日陰など、光が拡散された状態である必要があります。
- キャプチャーした画像の処理後の、より純粋なアルベドテクスチャ用には、Unity の De-Lighting tool を使用できます。
6. ライティングと設定
ここまでの時点で、メッシュに適切なテクスチャが施され、シーンが組み立てられ、適切なトーンマッピングが施されてレンダー設定が整いました。しかし、シーンの見た目を良くするためには、ライティングも適切に設定される必要があります。ここでは、リアルタイム GI を用いたセットアップを使用し、即座にフィードバックを得るためにリアルタイムライトによるライティングを行っている前提で話を進めて行きます(ベイキングに対しても同様の原則を適用しています)。
屋外のライティングとシーンの設定
- 半球ライティング 屋外ライティングの最初のコンポーネントは、半球ライティングです。これは Unity では Environment Lighting と呼ばれ、簡単に言うと空の光のことです。夜空が寄与する光は最小となり、日中の空が寄与する光は極めて明るくなります。半球の設定は Lighting タブ内(Window > Lighting > Settings > Environment)で行えます。 最初は、HDRI キューブマップではなくプロシージャルスカイボックスマテリアルから開始するのが賢明です。プロジェクト内で新規マテリアルを作成し、それを SkyMaterial と名付けて、Skybox/Procedural に設定してください。
これを、Lighting タブ > Scene 内にある Environment の Skybox Material にアサインしてください。
シーンにいくらかライティングが施されました。環境光として全体的に照らされていますが、あまり正確な半球ライティングとは言えません。しかし現時点ではこのままにしておきます。
- ディレクショナルライト 一般的な太陽光や月光は、ライトとシャドウの方向が平行で、ほぼ無限遠の距離にある光源を模倣するものであるため、通常はディレクショナルライトで表現されます。
- グローバルイルミネーション ディレクショナルライトと環境光だけでは、現実のようなライティングは作れません。しっかりした半球ライティングには、空の光のライティングのオクルージョンが必要で、太陽光に関しても間接的なライティングの反射が必要となります。この時点では、空はシーン全体にひとつの色値でレンダリングしているため、均一的な印象になってしまっています。ここで必要となるのが、オクルージョンや間接反射光ライティングの計算を行うリアルタイムグローバルイルミネーションやベイクしたライティングです。これを行うには、下記の手順に従ってください。
- リアルタイム GI やベイキングに寄与する必要のあるメッシュ全てに、必ず Enable Lightmap Static および Reflection Probe Static のフラグを追加するようにしてください(一般的には、大きな静的メッシュがこれに当たります)。
- 次に、Lighting タブ > Scene > Realtime Lighting で Realtime Global Illumination を有効にしてください(デフォルトの「Medium」の設定のままにしてください)。 「Generate Lighting」を押すか、「Auto Generate」にチェックマークを入れてください。
ライトの生成が完了すると、シーンが暗くなってしまいました。それだけでなく、シーン内の一部の要素が周囲から不自然に浮いた印象になっています(路面電車と背景の扉に注目してください)。この時点では、シーン内の静的オブジェクトには、半球に対する適切なオクルージョンと、ディレクショナルライトからの間接反射反応がある状態です。しかし、それ以外のオブジェクトには適切なライティング設定がされていません。
- ライトプローブとリフレクションプローブ 動的オブジェクトや非ライトマップオブジェクトが、リアルタイムあるいはベイク済のグローバルイルミネーションを受けるためには、シーン内にライトプローブを配置する必要があります。動的にライティングされるオブジェクト(プレイヤーなど)が配置された(または通過する)領域の近くに、効率的にライトプローブグループを分布させてください。 ライトプローブグループに関する詳細は、こちらでご確認いただけます。
「Generate Lighting」を再度押してください。または、「Auto Generate」にチェックマークが入っている場合は、事前計算の完了を待機してください。
路面電車と背景の扉は周囲に溶け込みましたが、反射がまだ不自然な状況です。空の反射がトンネル内にまで表れてしまっています。ここでリフレクションプローブの出番です。必要に応じて適切な範囲にリフレクションプローブを効率的に配置しましょう(上のシーンでは、中央のメインの部屋に 1 つで十分です)。一般的な基準としては、キューブマップの解像度(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 が有効になっています。デファードレンダリングでは、自動で有効になっていない場合に、ポストプロセスプロファイル内でもフォグを有効にしなければならない可能性があります。
屋内および局所的ライティング
- スポットライトとポイントライト リアルタイムの局所的ライティングの定番はスポットライトとポイントライトです。エリアライティングは、HD スクリプタブルレンダーパイプライン(HD SRP)を使用している場合以外は、ライティングをベイクする場合にのみ使用可能です。HD SRP モードでは、リアルタイムでレンダー可能な新しいエリアライトが使用できます。 基本的にこれら 2 種類のライトは、空間内の 1 点からライトを照射し、範囲の制限を持っています。スポットライトの場合はこれに角度の制限も加わります。 詳細はこちらをご覧ください。
この 2 種類のライトの大きな相違点は、シャドウの落とし方とクッキーとのインタラクト方法に関連しています。ポイントライトのシャドーイングにはシャドウマップが 6 つ必要ですが、スポットライトの場合は 1 つです。このため、シャドウを落とすポイントライトは大幅にコストが高くなるので、使用は極力控えることが推奨されます。(注)ベイクされたライトに関しては、この問題はありません。 もうひとつの違いは、スポットライトのクッキーテクスチャ―は単純な 2D テクスチャーであるのに対し、ポイントライトには(通常 3D ソフトウェアで作成される)キューブマップが 1 つ必要になることです。 詳細はこちらをご覧ください。
- ライトの色と強度 説得力のある表現を実現するための適切なライトの色と強度の選択は、一定のおおまかなガイドラインに沿って行う必要があります。 選択する色と値が及ぼす影響を考慮する必要があります。 屋内のライトの強度を選択する際は、どの屋内ライトにも太陽より高い強度を持たせないようにしてください。屋内ライトが太陽より高い強度を持っていると、シーンによっては見た目のバランスが悪くなります。
例えばこのサンプルシーンの場所でも、日中の明るさを超えるほどの強い光が天井から照らされるような状況はほぼ考えられません。
色を選択する際は、できるだけ、どのカラーチャンネルも完全に除外しない(値を 0 にしない)ようにしてください。除外するとホワイトポイントに達することのできないライトが作られてしまいます。
技術的には使用可能なライトの色ですが、左の画像のライトの色は、最終出力から青色の成分を取り除いてしまいます。シーンの基準となる最終的なカラーパレットを限定的なものにするのはあまり賢明ではありません。後にカラーグレーディングを行いたい場合はなおさらです。
- Emissive サーフェス Unity では、リアルタイム GI やベイクした GI が有効になっていれば、Emissive(放射性の)サーフェスをライティングに寄与させてエリアライティングの効果を表現することができます。これは特に、リアルタイム GI が有効の場合に役立ちます。開発者は(事前計算が行われれていれば)Emmisive サーフェスの強度と色を修正し、即座にフィードバックを得ることができます。
上の画像では、天井のメッシュから発せられる微かな拡散ライティングが確認できます。
ここまでの時点で、説得力のあるシーンを作るために必要な設定とライティングについての基礎を学ぶことができました。
7. ポストプロセッシング機能を理解する
その名前から想像できる通り、ポストプロセッシングとは、レンダーされた既存のシーンを基にしたレンダリングエフェクトです。ポストプロセッシングによるエフェクトは通常、シーンビューに依存しているか、レンダーされたシーンの上に最終的なレンダーの生成前にレイヤー化されます。この機能の利点のひとつは、ビジュアルフィードバックがその場で得られることと、既存のコンテンツに変更を加えることなくシーンを劇的に向上できる点です。 ポストプロセッシング内には、現実のようなビジュアルを作成するために必ず必要となるベースラインの機能だけでなく、その他の機能も数多く含まれています。シーンの品質を一層向上できる非常に効果的なエフェクトですので、時間をかけてでも習得する価値があります。このセクションでは、プロジェクトの状況にどのポストプロセッシングエフェクトが合っているかを判断し、高度な機能に伴った問題を回避するために必要な情報を提供します。 詳細は以下のリンクからご覧ください。 https://docs.unity3d.com/ja/current/Manual/PostProcessingOverview.html
- アンチエイリアシング(AA) 3D ポリゴンを 2D 画面に、制限された解像度でラスタライズする場合、 最終的なピクセルに階段状のエフェクト(エイリアシング)が表れます。リアルタイム 3D におけるアンチエイリアシングの技法は数多く存在します(Supersampling、MSAA、FXAA、 SMAA、Temporal、あるいはこれらの組み合わせやその他の新しい方式)。今日、最も一般的な技法は FXAA と Temporal です。効果的で比較的パフォーマンス性が高いことが理由となっています。
上の画像では、一部の目立ったエイリアシングエフェクトが FXAA によってうまく修正されています。しかし Temporal ではそれが更に改善されており、電車の線路に大幅な向上が見られます。FXAA は純粋なポストプロセス・アンチエイリアシングです。簡単に言うと、ラスタライズされたシーンがキャプチャーされ、エッジが分析され、平滑化のアルゴリズムが実行されます。FXAA は単純で、複雑な依存関係を持たず、処理も迅速です。Temporal AA はこれよりずっと複雑です。Temporal は、ブレンドする付加的データとしてジッターと直前のフレームを使用します。Temporal は、最終的なフレームをレンダーする際にどのピクセルを除外してどのピクセルを含めるか、モーションベクターを使用して予測します。目的は、最終的な解像度より大きなシーンをレンダーすることなしに、より多くのデータを使ってフレームの有効解像度を高めることです(Supersampling)。つまり、アンチエイリアシングが格段に滑らかになり、パフォーマンスに大きく影響することなく、SuperSampling を使用した場合とほぼ同程度の画質を得ることができます。リアルタイムレンダリングの全てに関して言えることですが、ここでもトレードオフが生じます。Temporal AA が機能するためにはモーションベクターが必要で、FXAA よりもパフォーマンスのコストが高くなります。Temporal が最終的な画像を予測する仕組みが複雑であるため、動きの速いオブジェクトやテクスチャのボケがある場合にアーチファクトが発生することがあるので、全てのアプリケーションに適した方式ではありません。
- アンビエントオクルージョン アンビエントオクルージョン・ポストプロセッシングは、スクリーンスペースデータ(主に深度)に基づいたアンビエントオクルージョンの近似であるため、通常「スクリーンスペースアンビエントオクルージョン」(SSAO)と呼ばれます。ライティングの設定に関するセクションで説明した通り、SSAO は、環境光ライティングのシェーディング時に、特に動的オブジェクト(静的シーンと動的シーンとの間におけるオクルージョンのインタラクションが通常は一切ない)には、高いリアリティが得られます。
基本的に SSAO はシーンの環境光シェーディングに役立つものですが、オクルージョンを大量に発生させることがあります。オブジェクトごとにベイクされたアンビエントオクルージョンをオフラインの DCC ソフトウェアから取り入れ、ライトのベイキングによる付加的なアンビエントオクルージョンを含めると、SSAO が 3 つ目のアンビエントオクルージョン・レイヤーとして扱われます。
SSAO の設定は最終的な出力を考えながら行い、他の AO ソリューションとのバランスを取るようにしてください。
AO を多く追加し過ぎて内部が非常に暗くなってしまっている例
- スクリーンスペースリフレクション SSAO と類似して、スクリーンスペースリフレクションも現在のシーンビューを使用してレイトレーシング経由でリフレクションを近似します。現実のようなビジュアルを実現するためには、ほとんどの場合はこの機能を有効にすることが推奨されます。スクリーンスペースリフレクションは、通常のキューブマップによるリフレクションを補足する高精度なリフレクションを追加します。ただしこの機能を有効にすると、レンダリングがディファ―ドレンダリングのみに制限され、パフォーマンスに影響します。SSR のもうひとつの短所は「スクリーンスペース」で、画面上にないものは一切リフレクションを発生させないため、リフレクションの欠落が起こる場合には画面のエッジの描画が破綻したり、ノイズが入ったりすることがあります。
- 被写界深度 デジタルコンテンツ制作者が被写界深度エフェクトと言うとき、その意図しているところは単に被写界深度を浅くする(あるいはそのように見せかけるだけの)効果のことであることがほとんどです。被写界深度というとまず頭に浮かぶのは、空間内の小さな一点にのみ焦点が合った、手前と奥がぼやけた画像だと思います。このエフェクトは大型センサーカメラのシネマティックな雰囲気を表現できますが、シーンのスケール感を変化させるために使用することもできます([例]ティルトシフトカメラのレンズによるミニチュア効果)。
上の画像では、通常の写真が疑似的な被写界深度によってミニチュアのように見えています。
- モーションブラー モーションブラーは乗り物酔いや認知感覚の乱れを引き起こすと言う人もいれば、絶対的な信頼を置いている人もいます。モーションブラーは有効にすべきか?その答えは、求めるエフェクトやアプリケーションによって変わります。微かなモーションブラーは、ひとつのフレームから別のフレームへの遷移をブレンドする場合に大変効果的です。これは、(一人称視点や三人称視点のカメラで一般的に見られるような)大きな差異のあるシーンの遷移に特に適しています。例えば、広角ビューでプレイヤーが左から右へカメラを素早く振ったりするような場合は、たとえ 60FPS でレンダーされていたとしてもモーションブラーがないとカクカクしてしまいます。
上の画像の例では 180 度のシャッター角でモーションブラーを実行しています(完全な 360 度のシャッター角だとフレーム時間一杯に軌跡が出て、それより小さい角度の場合は軌跡が少なくなります)。これを踏まえた上で、ストップモーション的な表現を作りたい場合は、モーションブラーを無効にすると良いでしょう。
- ブルームと Emissive 現実世界のブルームは、光線が適切にフォーカスされていない場合に起きるレンズのアーティファクトで、通常、低性能なカメラレンズや一部のカメラフィルターの特殊グロー効果に見られるものです。
ブルームは通常、霞がかったような柔らかい画像(上の画像ではしきい値の設定は 0)を作る目的か、高強度ライトの要素と高輝度ライトの要素を識別する(下の画像参照)目的で使用されます。
この機能を多用し過ぎると、参考画像(強度のしきい値が早々にブルームし始め、高強度ピクセルが多くなっている)のように逆効果になる可能性があります(しきい値がガンマ 1.0 の場合、現在の露出で 1.0 より大きい値になるとブルームが強くなります)。 しきい値の選択は、Emissive サーフェスの値、シーンのライティング設定、Eye Adaptation の有効・無効に応じて行います。
- Tonemapper のタイプ Tonemapper は、入力データのリニア HDR バッファを処理し、それを指定の色空間にレンダリングし戻して最終的な出力を行います。これはカメラが機能する仕組みに似ています。Unity のポストプロセッシング内には、Neutral および ACES(アカデミー色符号化仕様 / Academy Colour Encoding System)の 2 種類の Tonemapper があります。 ACES に関する詳細はウィキペディアをご覧ください(英語)。 一見すると、この 2 つの Tonemapper の違いはデフォルトのコントラストであるように見えます。しかし重要な違いはそれではありません。Neutral のコントラストを ACES に近くなるように調整することも可能だからです(下の画像では 2 つの画像がほとんど同じであることが確認できます)。
上の Neutral の設定は、Black が 0.02、White が 10、Black Out が -0.04、White Out が 10、White Level が 5.3、White Clip が 10 になっています。 2 つの Tonemapper の重要な違いは、色付きライトや Emissive エフェクト([例]爆発のエフェクトや火炎)などの強度の高い色値の扱い方にあります。
上の画像では、高強度色のノーマライズ方法が ACES Tonemapper と Neutral Tonemapper でどのように違うか確認できます。
- 色収差、グレインおよびビネット これらは現実世界のカメラの仕組みが生むアーティファクトをシミュレートするポストプロセスエフェクトです。この乱用を防ぐためには、それぞれのエフェクトが現実世界のカメラで起こる仕組みを理解することが役立ちます。
- 色収差(Chromatic Aberration / CA)エフェクトは、カメラのレンズが全ての色を同じ収束点に収束できない場合に画像に表れる、色の分散です。これは通常、正常にキャリブレーションされていないレンズや低品質レンズに見られます。時としてこれがデジタルシーンに現実感を与えることもありますが、低品質レンズのような印象を与える仮想カメラになるということでもあります。
- 現実世界の写真や映画の画像上に見られるグレインは通常、センサーに入って来るライトの量が足りないサインです([例]暗いシーンや ISO 感度の高いカメラセンサーやフィルムが発生させるノイズ)。このエフェクトは、純粋でクリーン過ぎる 3D レンダーシーンに現実感を与えるために、現実世界のカメラの制約をシミュレートして加えるものです。ただし、シーン内のノイズが多過ぎると、見ている側に動いているような錯覚を与えて気を散らすこととなり、また、レンダーされた最終的な画像のコントラストにも影響します。
- ビネット効果は色収差(CA)効果と似ており、レンズがカメラのセンサー / フィルムの中央から縁にかけてライトを均一に配分できない時に発生するアーティファクトです。これは、シーンの中心に焦点を合わせたような効果与えますが、乱用するとシーンの見た目がアマチュアの画像処理ソフトで処理されたようになってしまう可能性もあります。
以上、ポストプロセッシングの基礎を説明しましたが、重要なポイントは、チェックリストのように次々とポストプロセッシングを有効にしていくような大雑把なことを行わず、目的意識を持って効果的に機能を使用することです。エフェクトをひとつシーンに加えるごとに、パフォーマンスコストが掛かるからです。
ここで触れていないポストプロセッシングは、Eye Adaptation、(Tonemapper 以外の)Colour Grading、User Lut(Lookup Table)です。これらのエフェクトに関してはより詳しい説明が必要となります。詳細は下記のリンクからご覧ください。
https://docs.unity3d.com/ja/current/Manual/PostProcessing-EyeAdaptation.html
https://docs.unity3d.com/ja/current/Manual/PostProcessing-ColorGrading.html
https://docs.unity3d.com/ja/current/Manual/PostProcessing-UserLut.html
8. 動的に照らされるオブジェクト
動的に照らされるオブジェクトが特に大きな場合、静的なオブジェクトの場合よりも多くのコツが必要となります。多くの場合、非静的に照らされるオブジェクトは位置が変わることが想定されるため、動的ライティングの情報が必要となります。動的オブジェクトは、事前に設定された特定のライティング計算が利用できない場合は、これらの制約事項を念頭に置いて扱う必要があります。 動的オブジェクトのライティングの質を高めるに当たっては、以下の事項を考慮する必要があります。
- Light Probe Proxy Volume(LPPV) 動的ライティングによって照らされない動的オブジェクトのサーフェスは、一般的にはライトプローブのデータを使用してそのライティング情報を埋めます(プローブの存在しないシーン内では Environment Lighting が使用されます)。シーンに設定されているライティング方法によって、その内容は、間接ライティング情報や、シャドーイングやベイクされた拡散プローブライティング情報など、幅広く異なります。 このライトプローブ方式は通常、小さな動的オブジェクトには問題なく機能しますが、大きなオブジェクトの場合はより精密なライトプローブライティングが必要となります。そこで Light Probe Proxy Volumes が役に立ちます。Unity マニュアルの LPPV ガイドをご覧ください。 Light Probe Proxy Volumes を使用すると、動的に照らされる大きなオブジェクトが複数のライトプローブを使用できるようになり、ライティングの精度が高くなります。
上の画像のカプセルは LPPV を用いていますが、2x2x2 ボリュームのグリッドしか使用していないにも関わらず、ライトプローブのサンプリングが高精度になっているのが分かります。
- オブジェクトごとのベイクされたアンビエントオクルージョンマップ(AO) 動的オブジェクトは、ライトプローブか環境光によるライティングのみ影響を受けます。特に、オブジェクトが(サンプル内の電車のように)内部に凹んだ形状を持っている場合は、オブジェクトのオクルージョンを事前計算する必要があります。
上の画像で左側の、AO が適用されていない電車では、内部と外部のサーフェスを区別できない状態でライトプローブのライティングデータが適用されています。事前にベイクされた AO がある場合、外部から来るライトと反射の強度を抑制するガイドとしてこのマップが機能し、各段に自然な見た目になります。
オブジェクトごとのアンビエントオクルージョンのオフラインベイキングは、詳細度の高いメッシュから低いメッシュの順にベイクを行うことで、更に詳細なオクルージョンが与えられます。これは法線マップのベイキングの仕組みに似ています。
(注)オブジェクトごとの AO は、他の動的オブジェクトとはインタラクトしません。例えば電車に入って行くキャラクターなどの動的オブジェクトは、シーンからライトプローブデータを受けますが、必ずしも電車内部のオクルージョンとは調和しません。
- 局所的反射 ほとんどの動的オブジェクトは、それ自体は反射をしませんが、凹んだ形状の内部を持つオブジェクトの場合、そのオブジェクトにリフレクションプローブをアタッチしてそれをリアルタイムで実行できるようにすると、環境のリフレクションプローブから来る意図していない反射反応を抑制する一助となります。
反射の問題を分かりやすく極端に示したマテリアル
- 想定に基づいた疑似的シャドウと疑似的オクルージョン オブジェクトに特定の条件が想定されれば、ビジュアル品質の向上に使える手法があります。下の画像の例で、電車は常に線路上にあることが想定されており、床の上に影が落ちる領域のライトのオクルージョンを表現するために、Multiply という名前のシェーダーを適用したマテリアルを持つ透明な平面が配置されています。
これに似た手法で他のゲームで頻繁に使用されているのが、キャラクターが実際のシャドウを落とす代わりに、キャラクターの下にブロブ形のシャドウプロジェクターを配置するというものです。リアルタイムレンダリングでは通常、パフォーマンスコストが低くて機能する手法が見付かれば、それをソリューションとして導入できます。
ビジュアルレンダリングを向上できるコツやヒントは他にもありますが、上記のリストが、コンテンツ制作者の皆様が多様な目標ビジュアルに適ったソリューションを考える上での拠り所となれば嬉しく思います。
9. サンプルプロジェクトファイル
サンプルシーン『Spotlight Tunnel』は、コンテンツ制作者の皆様がハンズオンで学習と実験を行えるように、Unity サンフランシスコの Spotlight チームによって作成されました。
サンプルシーン『Spotlight Tunnel』のプロジェクトファイルはこちらからダウンロードしてください。
プロジェクトをフォルダーに展開し、Unity でプロジェクトを開いてください。
『Spotlight Tunnel』プロジェクトは Unity 2017.1.0f3 を使って作成されています。
Unity 2017.1.0f3 より新しいバージョンの Unity でこのプロジェクトを開く場合は、異なるバージョン間でライティングのデータ形式の互換性がない可能性があるため、ライティングのリビルドが必要となります。
本プロジェクトに含まれるすべてのアセットは、Unity エンジンを使用して開発されたプロジェクト内でのみご使用いただけます。