Unity を検索

ライトマッピングの一般的な 5 つの問題とその解決のためのヒント

2022年9月27日 カテゴリ: テクノロジー | 18 分 で読めます
Tech from the Trenches | Progressive Lightmapping guide, hero image
Tech from the Trenches | Progressive Lightmapping guide, hero image

私は最近、開発者が Unity エディターのベイク済みグローバルイルミネーション(GI)を最大限に活用できるように、プログレッシブライトマッパーのトラブルシューティングガイドを作成しました。この記事では、最も一般的な 5 つのライトマップの問題とその解決策を、画像と Unity マニュアルのページへのリンクで補足しながら解説しています。完全なガイドはフォーラムでご覧ください

1. シーンにベイク済みグローバルイルミネーションがない

Cornell Box scene rendered with no Global Illumination (left) and with Baked Global Illumination (right)
グローバルイルミネーションなしでレンダリングしたコーネルボックスのシーン(左)と、ベイク済みのグローバルイルミネーションを使ってレンダリングしたシーン(右)

特定の前提条件が満たされていない場合、プログレッシブライトマッパーはシーンにライティングを生成できないことがあります。この現象が起きる代表的な条件は以下の通りです(これ以外の条件で起きることもあります)。

  • GI Contributor としてマークされたオブジェクトがない
  • シーンにベイク済みのライトがない
  • シェーダーの問題

この問題を解決するには、以下のいずれかの方法を試してみることをお勧めします。

ゲームオブジェクトを GI Contributor としてマークする

Contribute GI settings under the Mesh Renderer component.
Mesh Renderer コンポーネントの GI Contribute 設定。

以下の手順で、ライトマップを付けたいオブジェクトを GI Contributor としてマークします。

  1. ゲームオブジェクトを選択する
  2. Mesh Renderer コンポーネントに移動する
  3. Lighting ヘッダーを展開する
  4. Contribute to Global Illumination チェックボックスをオンにする

以上の手順を行うことで、下にある Receive Global Illumination パラメーターが有効になります。2 つのオプションが含まれています。

  • Lightmaps:静的なライトマップを持つオブジェクトを対象としています。ゲームオブジェクトは GI を受け取り、GI をライトマップに寄与させます。
  • Light Probes:ライトマッピングに適さない小道具やオブジェクトを対象としています。ゲームオブジェクトはライトプローブから GI を受け取り、周囲のライトマップに GI を提供します。

シーンライトの確認

ベイク済みの GI に貢献できるのは、混合ライトとベイク済みのライトだけです。シーン内のライトを選択し、Light コンポーネントで ModeMixed または Baked のいずれかに設定します 。その他、チェックすべきプロパティは以下の通りです。

  • Color:暗い色は GI への寄与が少ないか、もしくは 0 になります。照明には明るい色を選び、Intensity プロパティを使って、照明を強めたり弱めたりするようにします。
  • Intensity:この値が高いほど、ライトが明るくなります。GI に十分寄与できるよう、ライトを十分明るくするようにしてください。
  • Indirect Multiplier:このプロパティは、間接的な光の跳ね返りの強さを制御します。このプロパティを 0 にしないようにしてください。もし 0 になっていると、光は GI に全く寄与しないことになります。この値を 1 以上に設定すると、シーンの照明が物理ベースレンダリング(PBR)の標準に適合しなくなることに注意してください。

Lighting Settings Asset を確認する

Lighting ウィンドウWindow > Rendering > Lighting でアクセス可能)で、Lighting Settings Asset フィールドが空白になっていないことを確認します。アセットが割り当てられていない場合は、New Lighting Settings ボタンをクリックします。これにより、アセットの作成と割り当てが行われ、ウィンドウ内のプロパティのロックが解除され、編集が可能になります。

この手順が終わったら以下を確認します。

  • Baked Global Illumination チェックボックスがオンで、ベイク済み GI の計算が有効にされていること。このチェックボックスをオンにすると、Lighting Mode ドロップダウンリストも公開されます。
  • Max Bounces の値が 0 に設定されていないこと。この値が高いほど、環境内での光の反射が多くなります。
  • Indirect Intensity スライダーが 0 に設定されていないこと。このスライダーを 0 に設定すると、シーン内のすべての間接照明が減衰します。

シェーダーとマテリアルを確認する

カスタムシェーダーが GI 計算の失敗の原因である可能性があります。デバッグ用には、Unity エディターに付属するビルトインシェーダーを使用しましょう。以下のものが該当します。

  • Standard Shader:ビルトインレンダーパイプラインで利用可能
  • Lit Shader:ユニバーサルレンダーパイプライン(URP)で利用可能
  • Lit Shader:HD レンダーパイプライン(HDRP)で利用可能

上記のシェーダーのいずれかに切り替えた後に Unity がライティングを生成した場合、カスタムシェーダーに問題がある可能性があります。この場合、サーフェスシェーダーが LIGHTMAP_ON シェーダーキーワードを含んでいることを確認します。

シェーダーを使用してベイク済みの GI 出力をさらにカスタマイズする方法の詳細については、Meta Pass のページを確認してください。

その他の修正候補

上記の手順で問題が解決しない場合は、以下の対処法を試してみてください。

  • Lighting ウィンドウで、異なるライトマップバックエンドを選択します。Progressive GPU に設定した時にライティングのベイクに失敗し、Progressive CPU に設定した時にベイクに成功した場合、ハードウェアまたはドライバーの問題である可能性があります。
  • GPU ドライバーをアップデートします。お使いのシステムに適したドライバーの情報は、GPU メーカーのページでご確認ください。(Linux マシンの場合は、こちらのフォーラムのスレッドの Linux ドライバーのセットアップのセクションをご確認ください)
  • GPU が最小限の要件を満たしていることを確認してください。こちらのフォーラムスレッドをご参照ください。
  • GI キャッシュをクリアする。これをクリアするには、Prefrences > GI Cache に移動し、Clean Cache ボタンをクリックします。この操作を行うと、シーンに存在するすべてのライティングデータが削除され、ライティングを再生成する必要があることに注意してください。

2. オブジェクトにライティングが効いていない

あるオブジェクトが光に照らされていない、または場違いなように見える場合は、シーンの設定に問題がある可能性があります。この問題は、動的なオブジェクトにライティングをサンプルするライトプローブがない場合に再現されることがよくあります。さらに、ローカルのリフレクションプローブが存在しない場合、シーン内の光沢のある金属のマテリアルが黒く表示されることがあります。

Cornell Box scene with a non-lightmapped metallic sphere and a statue: Both objects are black when no Light Probes or Reflection Probes are present (left). Diffuse statue is visible when lit by Light Probes (center). Both the reflective sphere and the statue are visible after placing Light Probes and Reflection Probes (right).
ライトマップが設定されていない金属球と彫像があるコーネルボックスのシーン。ライトプローブやリフレクションプローブが存在しない場合、どちらのオブジェクトも黒く表示される(左)。ライトプローブで照らすと、拡散反射する彫像が見える(中央)。ライトプローブとリフレクションプローブを置くと、光を反射する球と彫像の両方が見えるようになる(右)。

この問題を解決するには、以下のいずれかの方法を試してみることをお勧めします。

ライトプローブを配置する

動的なオブジェクト(またはライトプローブから GI を受け取る GI に寄与するオブジェクト(GI Contributor))は、間接ライティングデータをサンプリングするためにライトプローブを必要とします。存在しない場合、オブジェクトはアンビエントプローブ(つまり、シーンに常に存在するライトプローブとリフレクションプローブ)をサンプリングするようにフォールバックされます。

これを軽減するために、シーン内にライトプローブのネットワークを設定し、重要度の高いエリアにプローブを追加していきます。影響を受けるすべてのオブジェクトを包含するのに十分なライトプローブがあることを確認し、再度ライティングを生成して効果を確認します。

リフレクションプローブを配置する

ライトプローブを高密度に配置しても、反射のある金属のオブジェクトが黒く表示されることがあります。このようなオブジェクトのシェーディングを行うには、影響を受けるオブジェクトを包含するようにリフレクションプローブを配置する必要があります。ライティングを再度生成するか、Reflection Probe コンポーネントBake ボタンをクリックしてプローブを再度ベイクします。

反射に黒い部分が見られる場合は、Bounces の数を増やしてみてください。これにより、光が跳ね返る回数が増えます。つまり、反射の中に反射が生まれます。このプロパティは、Lighting > Environment > Environment Lighting からアクセスできます。

メッシュレンダラー設定を確認する

上記の手順を実行しても問題が解決しない場合は、影響を受けるオブジェクトの Mesh Renderer コンポーネントを確認します。Probes セクションで、Light ProbesReflection PropertiesOff 以外に設定されていることを確認します。

Light Probes and Reflection Probes properties need to be set to Blend Probes (or anything other than Off).
ライトプローブとリフレクションプローブのプロパティは、Blend Probes(または Off 以外の何か)に設定する必要があります。

マテリアルのカラー値を調整する

真っ黒なマテリアルは、直接光も間接光もすべて吸収してしまいます。これは物理的に正しい振る舞いです。現実には、自然界に存在する物質で完全に黒というものはありません。例えば、最も黒い天然素材の 1 つである石炭でも、RGB の輝度スケールでは「50, 50, 50」となります。

物理ベースのシェーディングの標準に従うように、マテリアルのカラー値を調整します。ビルトインレンダーパイプラインでは、Validate Albedo シーンビュー描画モードを使用して、アルベド値が物理ベースレンダリングの標準に従っているかどうかを判断することができます。URP および HDRP を使う場合は、レンダリングデバッガーで同様のことができます。

シーン設定の確認

複数のシーンで作業している場合、ライティングを含むシーンがアクティブなシーンとして設定されていることを確認してください。デフォルトでは、Unity は最初に読み込まれたシーンをアクティブなシーンとして設定しますが、これはスタンドアロンのプレイヤーをビルドする時に有害な影響を与える可能性があります。

3. エミッシブマテリアルがレンダリングを行わない

The plane in the ceiling and the sphere both have emissive materials applied to them (left). Bloom is enabled as a post-processing effect to give the impression of a glowing material (center). Emissive plane and sphere are both marked as GI Contributors influencing lighting in the scene (right).
天井の平面と球体には、ともにエミッシブマテリアルが設定されている(左)。ポストプロセッシングエフェクトとしてブルームを有効にすることで、光る素材のような印象を与えることができる(中央)。光を放出する面と球体は、シーン内のライティングに影響を与える GI Contributor としてマークされている(右)。

エミッシブマテリアルのレンダリングに関する問題は、2 種類あります。

  • エミッシブマテリアルが「光る」ように見えない。これはポストプロセッシングに問題があることを示しています。
  • エミッシブマテリアルがグローバルイルミネーションに寄与していない。これはオブジェクトまたはマテリアルの設定に問題があることを示しています。

これらの問題を解決するには、以下のいずれかの方法を試してみることをお勧めします。

ポストプロセッシングスタック で Bloom を有効にする

光っているような印象を与えるには、使用するポストプロセススタックで Bloom を有効にします。これを行う方法のヒントについては、ビルトインレンダーパイプラインURP、または HDRP のドキュメンテーションを参照してください。

マテリアルのプロパティを確認する

ライトマッピングに発光するオブジェクトを使用する場合は、以下のことを確認してください。

  • 対象のゲームオブジェクトを GI Contributor としてマークしている。発光するオブジェクトは自分を照らす性質があるため、その Receive Global Illumination プロパティをライトプローブに設定することができます。これにより、ライトマップアトラスのスペースを節約することができます。
  • Global Illumination プロパティがマテリアルのインスペクターBaked に設定されている。このプロパティは、Emission の入力から利用可能です。詳細については、ビルトインレンダーパイプラインURP、または HDRP のドキュメンテーションを参照してください。
Material Inspector in the Built-in Render Pipeline: We highlighted Emission properties in blue.
ビルトインレンダリングパイプラインのマテリアルインスペクター。Emission プロパティが青でハイライトされている。

ライティング設定を確認する

Lighting ウィンドウで、Indirect Intensity プロパティが 0 に設定されていないことを確認します。0 に設定すると、ベイク済みの発光するオブジェクトからのベイク済みの寄与を含む、すべての間接ライティングが無効となります。

4. 平らな法線マップ

Non-directional モードでベイクする場合、Unity エディターは指向性情報を保持するための別のテクスチャを作成しません。その結果、ベイク結果が平べったく見えてしまうのです。

低周波数の法線マップは指向性テクスチャを使用してキャプチャするのが困難であることには注意しておくべきでしょう。このようなテクスチャは、完全にベイク済みのライトを使用してライティングを生成した場合、平坦に見えます。

Non-directional lightmaps with a baked light (left) vs Directional lightmaps with a baked light (right): Non-directional lightmaps lack the directionality of incoming light, which provides a good representation of relief when using normal maps.
ベイク済みライトを使用した無指向性ライトマップ(左)とベイク済みライトを使用した指向性ライトマップ(右)。無指向性ライトマップは法線マップを使用した場合の浮き彫りの表現をよく与える入射光の指向性を持たない。

この問題を解決するには、以下のいずれかの方法を試してみることをお勧めします。

Directional モードに切り替える

Directionality mode drop-down in the Lighting settings window.
Lighting 設定ウィンドウの Directional Mode ドロップダウン

Lighting ウィンドウで、Directional Mode プロパティを Directional に設定します。このモードでは、支配的な光の方向を保存するセカンダリテクスチャが生成されます。法線マップは浮き彫りの表現に優れていますが、スペキュラー反応を持っていません。

混合ライトを使う

混合ライトは、リアルタイムなスペキュラーと法線の反応を提供します。プログレッシブライトマッパーは、間接ライティングをライトマップにベイクします。この組み合わせにより、ベイク済みライティング使用時の最高品質のマテリアル反応を実現します。

Directional lightmaps illuminated by a Baked spotlight (left) vs Directional lightmaps illuminated by a Mixed spotlight (right): Notice the improved contrast in the normal maps in the scene lit by the Mixed light.
ベイク済みのスポットライトで照らされた指向性ライトマップ(左)と、混合スポットライトで照らされた指向性ライトマップ(右)。混合ライトで照らされたシーンの法線マップのコントラストが向上していることに注目しよう。

プロジェクトで可能であれば、Light コンポーネントで、ライトの ModeMixed に切り替えてください。なお混合ライトにはリアルタイムライトと同じパフォーマンスコストがかかります。使用する Lighting Mode に応じて、混合ライトはリアルタイムのシャドウを投影しますが、ベイク済みのソフトシャドウは投影しません。

ライトプローブを使う

プローブで照らされたゲームオブジェクトは、ベイク済みライトで照らされたものよりもマテリアルの反応が良くなることが多いようです。アートディレクション上許されるのであれば、Mesh Renderer コンポーネントで、Receive Global Illumination プロパティを Light Probes に設定します。なお、Light Probe Proxy Volume(LPPV)を使用して、プローブで照らされたオブジェクトに空間的なグラデーションを追加することも可能です。

5. スペキュラー反応がない

A simple scene containing several Baked point lights before a lightmap bake (left) vs same scene after baking lightmaps (right): Notice that specular highlights are missing after baking.
ライトマップベイク前の複数のベイク済みポイントライトを含むシンプルなシーン(左)と、ライトマップベイク後の同じシーン(右)。ベイク後、スペキュラーハイライトが欠落していることに注意しよう。

ベイク済みライトの本質的な限界の 1 つは、マテリアルに対するリアルタイムのスペキュラー反応が得られないことです。つまり、光沢のある素材の場合、ライティング生成後にスペキュラーハイライトが欠けることになります。

この問題を解決するには、以下のいずれかの方法を試してみることをお勧めします。

混合ライトを使う

ベイク済みのライトとは異なり、混合ライトは、マテリアルに対するリアルタイムの直接的なスペキュラー反応を提供します。スペキュラーハイライトが重要なシーンでは、Light コンポーネント で、ライトの ModeMixed に切り替えてください。

エミッシブプロキシを使用する

発光するオブジェクトを使ってライトからのスペキュラー反応を模倣することが可能です。これを行うには、以下の手順に従ってください。

  1. リフレクションプローブをシーンに配置する。
  2. Hierarchy パネルで右クリックし、3D Object > Sphere を選択する。
  3. 新しく作成したオブジェクトを選択し、その Static Editor FlagReflection Probe Static に設定する。
  4. Project パネルで右クリックし、Create > Material を選択して、新しいマテリアルを作成する。
  5. 新しく作成したマテリアルを選択し、Emission チェックボックスをオンにします。Global Illumination プロパティを None に設定する。
  6. マテリアルを球体にドラッグアンドドロップして割り当てる。
  7. 球体をライトと同じ位置に置く。
  8. ライティングを生成する。

上記の手順を踏むと、リフレクションプローブのキューブマップにキャプチャされた発光するオブジェクトを見ることができるはずです。ベイク後にそれらのオブジェクトを隠したり、Camera コンポーネントカリングマスクを設定したりすることができます。

Same scene but with emissive proxies captured by the Reflection Probe (left) vs an alternative perspective showcasing the placement of said proxies (right)
同じシーンで、リフレクションプローブでキャプチャしたエミッシブプロキシ(左)と、別の視点からプロキシの配置を示したもの(右)。

プログレッシブライトマッパーのトラブルシューティングの詳細については、フォーラムで公開されている完全なガイドをご参照ください。この記事について議論したい、あるいは他の解決策を共有したいという方は、ぜひこちらからご連絡ください。最後に、現在連載中の Tech from the Trenches シリーズの他の Unity 開発者による新しい技術ブログをぜひご覧ください。

2022年9月27日 カテゴリ: テクノロジー | 18 分 で読めます
関連する投稿