私は最近、開発者が Unity エディターのベイク済みグローバルイルミネーション(GI)を最大限に活用できるように、プログレッシブライトマッパーのトラブルシューティングガイドを作成しました。この記事では、最も一般的な 5 つのライトマップの問題とその解決策を、画像と Unity マニュアルのページへのリンクで補足しながら解説しています。完全なガイドはフォーラムでご覧ください。
特定の前提条件が満たされていない場合、プログレッシブライトマッパーはシーンにライティングを生成できないことがあります。この現象が起きる代表的な条件は以下の通りです(これ以外の条件で起きることもあります)。
この問題を解決するには、以下のいずれかの方法を試してみることをお勧めします。
以下の手順で、ライトマップを付けたいオブジェクトを GI Contributor としてマークします。
以上の手順を行うことで、下にある Receive Global Illumination パラメーターが有効になります。2 つのオプションが含まれています。
ベイク済みの GI に貢献できるのは、混合ライトとベイク済みのライトだけです。シーン内のライトを選択し、Light コンポーネントで Mode を Mixed または Baked のいずれかに設定します 。その他、チェックすべきプロパティは以下の通りです。
Lighting ウィンドウ (Window > Rendering > Lighting でアクセス可能)で、Lighting Settings Asset フィールドが空白になっていないことを確認します。アセットが割り当てられていない場合は、New Lighting Settings ボタンをクリックします。これにより、アセットの作成と割り当てが行われ、ウィンドウ内のプロパティのロックが解除され、編集が可能になります。
この手順が終わったら以下を確認します。
カスタムシェーダーが GI 計算の失敗の原因である可能性があります。デバッグ用には、Unity エディターに付属するビルトインシェーダーを使用しましょう。以下のものが該当します。
上記のシェーダーのいずれかに切り替えた後に Unity がライティングを生成した場合、カスタムシェーダーに問題がある可能性があります。この場合、サーフェスシェーダーが LIGHTMAP_ON シェーダーキーワードを含んでいることを確認します。
シェーダーを使用してベイク済みの GI 出力をさらにカスタマイズする方法の詳細については、Meta Pass のページを確認してください。
上記の手順で問題が解決しない場合は、以下の対処法を試してみてください。
あるオブジェクトが光に照らされていない、または場違いなように見える場合は、シーンの設定に問題がある可能性があります。この問題は、動的なオブジェクトにライティングをサンプルするライトプローブがない場合に再現されることがよくあります。さらに、ローカルのリフレクションプローブが存在しない場合、シーン内の光沢のある金属のマテリアルが黒く表示されることがあります。
この問題を解決するには、以下のいずれかの方法を試してみることをお勧めします。
動的なオブジェクト(またはライトプローブから GI を受け取る GI に寄与するオブジェクト(GI Contributor))は、間接ライティングデータをサンプリングするためにライトプローブを必要とします。存在しない場合、オブジェクトはアンビエントプローブ(つまり、シーンに常に存在するライトプローブとリフレクションプローブ)をサンプリングするようにフォールバックされます。
これを軽減するために、シーン内にライトプローブのネットワークを設定し、重要度の高いエリアにプローブを追加していきます。影響を受けるすべてのオブジェクトを包含するのに十分なライトプローブがあることを確認し、再度ライティングを生成して効果を確認します。
ライトプローブを高密度に配置しても、反射のある金属のオブジェクトが黒く表示されることがあります。このようなオブジェクトのシェーディングを行うには、影響を受けるオブジェクトを包含するようにリフレクションプローブを配置する必要があります。ライティングを再度生成するか、Reflection Probe コンポーネントの Bake ボタンをクリックしてプローブを再度ベイクします。
反射に黒い部分が見られる場合は、Bounces の数を増やしてみてください。これにより、光が跳ね返る回数が増えます。つまり、反射の中に反射が生まれます。このプロパティは、Lighting > Environment > Environment Lighting からアクセスできます。
上記の手順を実行しても問題が解決しない場合は、影響を受けるオブジェクトの Mesh Renderer コンポーネントを確認します。Probes セクションで、Light Probes と Reflection Properties が Off 以外に設定されていることを確認します。
真っ黒なマテリアルは、直接光も間接光もすべて吸収してしまいます。これは物理的に正しい振る舞いです。現実には、自然界に存在する物質で完全に黒というものはありません。例えば、最も黒い天然素材の 1 つである石炭でも、RGB の輝度スケールでは「50, 50, 50」となります。
物理ベースのシェーディングの標準に従うように、マテリアルのカラー値を調整します。ビルトインレンダーパイプラインでは、Validate Albedo シーンビュー描画モードを使用して、アルベド値が物理ベースレンダリングの標準に従っているかどうかを判断することができます。URP および HDRP を使う場合は、レンダリングデバッガーで同様のことができます。
エミッシブマテリアルのレンダリングに関する問題は、2 種類あります。
これらの問題を解決するには、以下のいずれかの方法を試してみることをお勧めします。
光っているような印象を与えるには、使用するポストプロセススタックで Bloom を有効にします。これを行う方法のヒントについては、ビルトインレンダーパイプライン、URP、または HDRP のドキュメンテーションを参照してください。
ライトマッピングに発光するオブジェクトを使用する場合は、以下のことを確認してください。
Lighting ウィンドウで、Indirect Intensity プロパティが 0 に設定されていないことを確認します。0 に設定すると、ベイク済みの発光するオブジェクトからのベイク済みの寄与を含む、すべての間接ライティングが無効となります。
Non-directional モードでベイクする場合、Unity エディターは指向性情報を保持するための別のテクスチャを作成しません。その結果、ベイク結果が平べったく見えてしまうのです。
低周波数の法線マップは指向性テクスチャを使用してキャプチャするのが困難であることには注意しておくべきでしょう。このようなテクスチャは、完全にベイク済みのライトを使用してライティングを生成した場合、平坦に見えます。
この問題を解決するには、以下のいずれかの方法を試してみることをお勧めします。
Lighting ウィンドウで、Directional Mode プロパティを Directional に設定します。このモードでは、支配的な光の方向を保存するセカンダリテクスチャが生成されます。法線マップは浮き彫りの表現に優れていますが、スペキュラー反応を持っていません。
混合ライトは、リアルタイムなスペキュラーと法線の反応を提供します。プログレッシブライトマッパーは、間接ライティングをライトマップにベイクします。この組み合わせにより、ベイク済みライティング使用時の最高品質のマテリアル反応を実現します。
プロジェクトで可能であれば、Light コンポーネントで、ライトの Mode を Mixed に切り替えてください。なお混合ライトにはリアルタイムライトと同じパフォーマンスコストがかかります。使用する Lighting Mode に応じて、混合ライトはリアルタイムのシャドウを投影しますが、ベイク済みのソフトシャドウは投影しません。
プローブで照らされたゲームオブジェクトは、ベイク済みライトで照らされたものよりもマテリアルの反応が良くなることが多いようです。アートディレクション上許されるのであれば、Mesh Renderer コンポーネントで、Receive Global Illumination プロパティを Light Probes に設定します。なお、Light Probe Proxy Volume(LPPV)を使用して、プローブで照らされたオブジェクトに空間的なグラデーションを追加することも可能です。
ベイク済みライトの本質的な限界の 1 つは、マテリアルに対するリアルタイムのスペキュラー反応が得られないことです。つまり、光沢のある素材の場合、ライティング生成後にスペキュラーハイライトが欠けることになります。
この問題を解決するには、以下のいずれかの方法を試してみることをお勧めします。
ベイク済みのライトとは異なり、混合ライトは、マテリアルに対するリアルタイムの直接的なスペキュラー反応を提供します。スペキュラーハイライトが重要なシーンでは、Light コンポーネント で、ライトの Mode を Mixed に切り替えてください。
発光するオブジェクトを使ってライトからのスペキュラー反応を模倣することが可能です。これを行うには、以下の手順に従ってください。
上記の手順を踏むと、リフレクションプローブのキューブマップにキャプチャされた発光するオブジェクトを見ることができるはずです。ベイク後にそれらのオブジェクトを隠したり、Camera コンポーネントでカリングマスクを設定したりすることができます。
プログレッシブライトマッパーのトラブルシューティングの詳細については、フォーラムで公開されている完全なガイドをご参照ください。この記事について議論したい、あるいは他の解決策を共有したいという方は、ぜひこちらからご連絡ください。最後に、現在連載中の Tech from the Trenches シリーズの他の Unity 開発者による新しい技術ブログをぜひご覧ください。