ライトと影

はじめに

ライトは、マテリアルと混合して目に見える結果を生成する光を発します。光は、シーン内のいくつかのタイプのライトから発生します:

  • emission colorの形のマテリアル自体から(ただし、焼き込みをしない限り近くのオブジェクトには影響しません)。
  • Lightノード: Directional(指向性)、Omni(オムニ)、Spot(スポット)。
  • Environment のAmbient Light(環境光)。
  • Baked(焼き込み)ライト(read:ref:doc_baked_lightmaps)。

emission colorはマテリアルプロパティです。詳細については、Spatial(空間)マテリアル チュートリアルをご覧ください。

Lightノード

Lightノードには、Directional lightOmni lightSpot light の3つのタイプがあります。ライトの一般的なパラメーターを見てみましょう:

../../_images/light_params.png

それぞれに特定の機能があります:

  • Color: 放射する光の基本色。
  • Energy: エネルギー乗数。これは、ライトを飽和させる場合や、ゲームエンジンでのライトトランスポート で作業する場合に便利です。
  • Indirect Energy: 間接光で使用されるセカンダリ乗数(光の跳ね返り)。これは、焼き込みライトまたはGIProbeで機能します。
  • Negative: 光は加算ではなく減算になります。暗い隅を手動で補正すると便利な場合があります。
  • Specular: このライトの影響を受けるオブジェクトのスペキュラーblobの強度に影響します。ゼロにすると、この光は純粋な拡散(diffuse)光になります。
  • Bake Mode: ライトの焼き込み(ベイク)モードを設定します。詳細については、次を参照してください。ベイクドライトマップ(焼き込み済ライトマップ)
  • Cull Mask: 下の選択されたレイヤーにあるオブジェクトは、このライトの影響を受けます。

シャドウマッピング

ライトはオプションで影を落とすことができます。これにより、よりリアルになります(光は遮蔽された領域に届かない)が、パフォーマンスコストが大きくなる可能性があります。一般的なshadowのパラメーターのリストがあり、それぞれに特定の機能があります:

  • Enabled: チェックすると、このライトでシャドウマッピングが有効になります。
  • Color: 隠された領域にこの色が掛けられます。デフォルトでは黒ですが、色つきの影に変更できます。
  • Bias: このパラメーターが小さすぎると、セルフシャドウ(自分自身に影を落とす)が発生します。大きすぎると、影が投影元から分離します。あなたに最適なものに微調整してください。
  • Contact: 短いスクリーンスペースレイキャストを実行して、バイアスによって生成されるギャップを減らします。 Contactは、GLES3バックエンドを使用している場合にのみ使用できます。
  • Reverse Cull Faces: 一部のシーンは、face-cullingを逆にしてシャドウマッピングをレンダリングするとより効果的に動作します。

以下は、biasを調整した時の外観のイメージです。ほとんどの場合、デフォルト値で機能しますが、一般的にはジオメトリのサイズと複雑さで変わってきます。

../../_images/shadow_bias.png

最後に、ギャップを解決できない場合は、Contact オプションが役立ちます:

../../_images/shadow_contact.png

シャドウマップの解像度を上げると、あらゆる種類のバイアスの問題をいつでも修正できますが、ローエンドハードウェアのパフォーマンスが低下する可能性があります。

指向性(Directional)ライト

これは最も一般的なタイプのライトであり、非常に遠くの光源(太陽など)を表します。また、計算するのに最も安価なライトであり、可能な限りこれを使用する必要があります(ただし、計算が最も安価なシャドウマップではありませんが、後で詳しく説明します)。

指向性ライトは、シーン全体をカバーする無数の平行光線をモデル化します。directional lightノードは、光線の方向を示す大きな矢印で表されます。ただし、ノードの位置は照明にまったく影響せず、どこにでも配置できます。

../../_images/light_directional.png

前面が光線に当たっているすべての面が照らされ、他の面は暗くなります。ほとんどのライトタイプには特定のパラメーターがありますが、指向性ライトは本質的に非常に単純であるため、そのようなものはありません。

指向性ライトのシャドウマッピング

シャドウ マップを計算するには、シーン全体をカバーする直交する視点(または最大距離まで)からシーンがレンダリングされます(奥行のみ)。しかしこれでは、カメラに近いオブジェクトはブロック状の影を受けるため、この方法には問題があります。

../../_images/shadow_blocky.png

これを修正するには、"Parallel Split Shadow Maps"(またはPSSM)という名前の手法を使用します。これにより、フラスタム(視錐台)が2つまたは4つの領域に分割されます。各エリアには独自のシャドウマップがあります。これにより、視点に近い小さな領域は、遠くの大きな領域と同じ影の解像度を持つことができます。

../../_images/pssm_explained.png

これにより、影がより詳細になります:

../../_images/shadow_pssm.png

PSSMを制御するために、いくつかのパラメーターが公開されています:

../../_images/directional_shadow_params.png

各Split(分割)距離はカメラのFarを基準にして制御されるため(または、値が0より大きい場合はshadowの Max Distance)、0.0 は目の位置で、1.0 は影の処理が行われなくなる場所です。Splitはその中間にあります。通常、デフォルト値は適切に機能しますが、最初のSplitを少し調整することで、近くのオブジェクト(第三者のゲームのキャラクターなど)に精緻さを与えることが一般的です。

必ず、シーンに必要な内容に応じてShadowの Max Distance を設定してください。最大距離を短くすると、影の見栄えが良くなります。

場合によっては、スプリットと次のスプリットとの間の移行が悪く見える場合があります。これを修正するには、"Blend Splits" オプションをオンにします。これにより、スムーズな移行と引き換えに精細度が犠牲になります:

../../_images/blend_splits.png

"Normal Bias" パラメーターを使用して、オブジェクトがライトに垂直な場合のセルフシャドウイングの特殊なケースを修正できます。唯一の欠点は、影が少し薄くなることです。

../../_images/normal_bias.png

"Bias Split Scale" パラメーターは、遠く離れたスプリットの追加バイアスを制御できます。セルフシャドウイングが遠く離れたスプリットでのみ発生する場合、この値はそれらを修正できます。

最後に、"Depth Range" には2つの設定があります:

  • Stable: カメラが動いている間、影を安定に保ちます。また、影のエッジに近いときにアウトラインに表示されるブロックはそのまま残ります。これはデフォルトであり、一般的に望ましいものですが、有効な影の解像度が低下します。
  • Optimized: 常に利用可能な最大解像度を達成しようとします。これにより、影の端に「動くのこぎり」効果が生じる場合がありますが、同時に影はより詳細に見えます(なので、この効果は許されるほど微妙な場合があります)。

シーンに適した設定を試してみてください。

指向性ライトのシャドウマップサイズは、[プロジェクト設定] → [Rendering ] → [Quality]で変更できます:

../../_images/project_setting_shadow.png

値を大きくすると、バイアスの問題は解決できますが、パフォーマンスは低下します。シャドウマッピングは微調整の技術です。

オムニ(Omni/全方位)ライト

オムニライトは、特定の半径までのすべての方向に球形に光を放射する点光源です。

../../_images/light_omni.png

実際には、光の減衰は逆関数です。つまり、オムニライトには半径があるわけではありません。これは、複数のオムニライトの計算が要求されるようになることを意味するため、問題です。

これを解決するために、Attenuation(減衰)関数とともに Range が導入されています。

../../_images/light_omni_params.png

これらの2つのパラメーターを使用すると、視覚的に美しい結果を得るために、これが視覚的にどのように機能するかを微調整できます。

../../_images/light_attenuation.png

オムニライトのシャドウマッピング

オムニライトのシャドウマッピングは比較的簡単です。考慮する必要がある主な問題は、レンダリングに使用されるアルゴリズムです。

オムニシャドウは、"Dual Paraboloid" または "Cube Mapped" としてレンダリングできます。前者はすばやくレンダリングされますが、変形を引き起こす可能性があり、後者はより正確ですが、コストがかかります。

../../_images/shadow_omni_dp_cm.png

レンダリングされるオブジェクトの大部分が不規則な場合、通常はDual Paraboloidで十分です。いずれにせよ、これらのシャドウはシャドウアトラスにキャッシュされるため(詳細については最後に説明します)、ほとんどのシーンでパフォーマンスに違いが生じることはありません。

スポット(Spot)ライト

スポットライトはオムニライトと似ていますが、コーン(または「カットオフ」)にのみ光を放出する点が異なります。懐中電灯、車のライト、反射板、スポットなどをシミュレートするのに役立ちます。このタイプのライトは、ライトが指し示す反対方向に向かって(角度が大きくなるほど)減衰します。

../../_images/light_spot.png

スポットライトは OmniLight と同じ Range および Attenuation を共有し、2つのパラメーターを追加します。

  • Angle: ライトの開口角
  • Angle Attenuation: コーンの減衰。コーンの境界を柔らかくするのに役立ちます。

スポットライトのシャドウマッピング

スポットはシャドウマッピングのパラメーターを必要としません。 89度以上の絞りでは、スポットの影が機能しなくなるため、代わりにオムニライトを使用することを検討してください。

Shadow atlas(シャドウアトラス)

独自のシャドウテクスチャを持つ指向性ライトとは異なり、オムニライトとスポットライトはシャドウアトラスのスロットに割り当てられます。このアトラスは、[プロジェクト設定] → [Rendering ] → [Quality ] → [Shadow Atlas]で設定できます。

../../_images/shadow_atlas.png

解像度は、シャドウアトラス全体に適用されます。このアトラスは、4つの象限に分かれています:

../../_images/shadow_quadrants.png

各象限を細分化して、シャドウマップをいくつでも割り当てることができます。以下はデフォルトのサブディビジョンです:

../../_images/shadow_quadrants2.png

割り当てロジックは簡単です。最大のシャドウマップサイズ(サブディビジョンが使用されていない場合)は、画面サイズ(またはそれ以上)のライトを表します。サブディビジョン(より小さなマップ)は、視界から遠く、比例的に小さいライトの影を表します。

すべてのフレームで、すべてのライトに対して次の手順が実行されます:

  1. ライトが適切なサイズのスロットにあるかどうかを確認します。そうでない場合は、再レンダリングして、より大きな/より小さなスロットに移動します。
  2. シャドウマップに影響するオブジェクトが変更されていないか確認してください。もしそうなら、ライトを再レンダリングします。
  3. 上記のいずれも発生していない場合、何も実行されず、影はそのまま残されます。

象限のスロットがいっぱいになると、サイズと距離に応じて、ライトは小さなスロットに押し込められます。

この割り当て戦略は、ほとんどのゲームで機能しますが、場合によっては別のものを使用することもできます(たとえば、すべてのライトが同じサイズで、象限がすべて同じサブディビジョンを持つトップダウンゲーム)。

シャドウフィルターの品質

影のフィルター品質を調整できます。これは、[プロジェクト設定] → [Rendering ] → [Quality ] → [Shadows]にあります。 Godotはフィルターなし(Disabled)とPCF5およびPCF13をサポートします。

../../_images/shadow_pcf1.png

影の輪郭のブロック性に影響します:

../../_images/shadow_pcf2.png