Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

序言

怎麼樣算是好的說明文件?

*全域照明*是一個包羅萬象的術語,用於描述同時使用直接光(直接來自光源的光)和間接光(從表面反射的光)的照明系統。在 3D 渲染引擎中,全域照明是實作逼真照明的最重要元素之一。全局照明旨在模仿現實生活中光的行為方式,例如光在表面上反射以及光從發光材料發出。

在下面的範例中,整個場景由發光材質(頂部的白色方塊)照亮。背面的白色牆壁和天花板在靠近牆壁的地方被染成紅色和綠色,因為彩色牆壁上反射的光線被反射回場景的其餘部分。

../../../_images/global_illumination_example.webp

全局照明由幾個關鍵概念組成:

間接漫射照明

這是不隨相機角度而改變的照明。間接漫射照明有兩個主要來源:

  • 光在表面上「反彈」。這種反射光會與材質的反照率顏色相乘。然後,反射的照明可以被其他表面反射,由於光衰減而減少影響。在現實生活中,光會反射無數次。然而,出於性能原因,這無法在遊戲引擎中模擬。相反,反彈次數通常限制為 1 或 2(或在烘焙光貼圖時最多為 16)。反射次數越多,陰影區域的光線衰減就越真實,但代價是效能降低或烘烤時間更長。

  • 發光材料還可以發射可在表面反射的光。這相當於“區域照明”的一種形式。確定大小的區域將使用自己的表面發光,而不是使用 OmniLight3D 或 SpotLight3D 節點讓無限小的點發光。

直接漫射照明已經由光節點本身處理,這意味著全局照明演算法僅嘗試表示間接照明。

不同的全域照明技術提供不同等級的精確度來表示間接漫射照明。有關更多信息,請參閱本頁底部的比較表。

為了提供小物件更準確的環境光遮擋,可以在環境 <doc_environment_and_post_processing> 設定中啟用螢幕空間環境光遮擋 (SSAO)。 SSAO 具有顯著的效能成本,因此在針對低階硬體時請確保已停用它。

備註

間接漫射照明可能是沒有詳細紋理的場景中色帶的來源。這會導致光線漸進不平滑,而是具有可見的“步進”效果。請參閱 3D 渲染限製檔案中的 doc_3d_rendering_limitations_color_banding 部分,以了解減少這種影響的方法。

|regular| 稍微

鏡面照明也稱為“反射”。這是根據相機角度改變強度的照明。這種鏡面照明可以是「直接」或「間接」。

大多數全局照明技術都提供了渲染鏡面照明的方法。然而,不同技術渲染鏡面光照的精確度差異很大。有關更多信息,請參閱本頁底部的比較表。

為了提供小物件更準確的反射,可以在環境 <doc_environment_and_post_processing> 設定中啟用螢幕空間反射 (SSR)。 SSR 具有顯著的效能成本(甚至比 SSAO 更高),因此在針對低階硬體時請確保已停用它。

GDScript是什麼?為什麼我要用它?

在確定要使用的全域照明 (GI) 技術時,需要牢記幾個標準:

  • 性能。 與半實時或烘焙技術相比,實時 GI 技術通常更昂貴。請注意,GI 渲染的大部分成本都花在 GPU 上,而不是 CPU 上。

  • 視覺效果。 除了表現不佳之外,即時 GI 技術通常無法提供最佳的視覺輸出。在大多數靜態場景中尤其如此,即時 GI 的動態功能不容易被注意到。如果最大化視覺品質是您的目標,烘焙技術通常會看起來更好,並且會減少漏光。

  • 實時能力。 一些 GI 技術是完全實時的,而另一些則只是半實時或根本不是實時的。半實時技術具有全實時技術沒有的限制。例如,動態物件可能不會向場景提供發射照明。非即時技術不支援「任何」形式的動態 GI,因此如果需要,必須使用其他技術來偽造它(例如將位置光放置在發光錶面附近)。即時能力也會影響 GI 技術在程式產生關卡中的可行性。

  • 需要使用者工作。 有些 GI 技術是全自動的,而其他技術則需要使用者仔細規劃和手動工作。根據您的時間預算,某些 GI 技術可能比其他技術更好。

以下是 Godot 中可用的所有全域照明技術的比較:

效能

按照效能從最快到最慢的順序:

  • 反射:

    • 更新模式設定為 Always 的 ReflectionProbes 比更新模式設定為 Once (預設)的探查昂貴得多。適用於使用 Once 更新模式時的整合式顯示卡。 使用 Forward Mobile 後端時可用。將在以後版本的兼容性後端中提供。

  • 字面值

    • 燈光可以僅使用間接照明進行烘焙,也可以基於每個燈光進行完全烘焙,以進一步提高性能。可以使用混合設定(例如具有即時定向光和完全烘焙的位置光)。可以在烘焙之前啟用方向訊息,以較小的性能成本(並以較大的檔案大小為代價)改善視覺效果。適合整合顯示卡。 使用 Forward Mobile 後端時可用。將在以後版本的兼容性後端中提供。

  • VoxelGI:

    • 可以調整烘焙的細分數量以平衡性能和品質。 VoxelGI 渲染品質可以在專案設定中調整。渲染可以選擇以半解析度執行(然後線性縮放)以顯著提高效能。 不可用 使用 Forward Mobile 或相容性後端時。

  • GLES3: 螢幕空間週遭遮擋。

    • 可以在「專案設定」中調整 SSIL 品質和模糊頻道數量。預設情況下,SSIL 渲染以一半解析度執行(然後線性縮放)以確保合理的效能等級。 不可用 使用 Forward Mobile 或相容性後端時。

  • SDFGI:

    • 可以調整級聯的數量以平衡性能和品質。每影格投射的光線數量可以在「專案設定」中調整。渲染可以選擇以半解析度執行(然後線性縮放)以顯著提高效能。 不可用 使用 Forward Mobile 或相容性後端時。

視覺腳本 (VisualScript)

為了進行比較,這裡有一個未使用全域照明選項的 3D 場景:

沒有任何形式的全局照明的 3D 場景(只有恆定的環境照明)。相機附近的盒子和球體都是動態物體。

沒有任何形式的全局照明的 3D 場景(只有恆定的環境照明)。相機附近的盒子和球體都是動態物體。

以下是 Godot 的各種全域照明技術的比較:

  • VoxelGI: |平均|良好的反射和間接照明,但要小心洩漏。

    • 由於其基於體素的性質,如果牆壁和地板太薄,VoxelGI 將出現漏光。建議確保所有實體表面至少與一個體素一樣厚。

      在傾斜的表面上也可能會看到條紋偽影。在這種情況下,調整偏移屬性或旋轉 VoxelGI 節點可以幫助解決這個問題。

      VoxelGI 的實際應用。

      VoxelGI 的實際應用。

  • SDFGI: |平均|良好的反射和間接照明,但要注意洩漏和可見的級聯偏移。

    • GI 細節等級會根據相機與表面之間的距離而變化。

      透過啟用 使用遮蔽 屬性可以顯著減少洩漏。這具有較小的性能成本,但與 VoxelGI 相比,它通常會導致更少的洩漏。

      當相機快速移動時,可能會看到級聯移位。透過調整級聯大小或使用霧氣可以使這種情況變得不那麼明顯。

      定義一個函式。

      定義一個函式。

  • 螢幕空間間接照明 (SSIL): |平均|良好的“次要”間接照明源,但沒有反射。

    • SSIL 旨在用作另一種 GI 技術(例如 VoxelGI、SDFGI 或 LightmapGI)的補充。 SSIL 最適合小規模細節,因為它本身無法為大型結構提供準確的間接照明。在其他 GI 技術無法捕捉小尺度細節或動態物件的情況下,SSIL 可以提供即時間接照明。其螢幕空間性質會導致一些偽影,尤其是當物件進入和離開螢幕時。 SSIL 使用最後一影格的顏色(在後處理之前)工作,這意味著包含自發光裝飾和自訂著色器(只要它們出現在螢幕上)。

      SSIL 的實際應用(沒有其他 GI 技術)。注意黃色框周圍的發射光。

      SSIL 的實際應用(沒有其他 GI 技術)。注意黃色框周圍的發射光。

  • LightmapGI: |好|出色的間接照明,良好的反射(可選)。

    • 這是唯一可以將光反射次數提高到 2 以上(最多 16 個)的技術。啟用方向資訊後,球諧函式 (SH) 用於提供模糊反射。

      LightmapGI 的實際應用。這裡只烘焙間接光照,但也可以烘焙直接光照。

      LightmapGI 的實際應用。這裡只烘焙間接光照,但也可以烘焙直接光照。

  • ReflectionProbe: |平均|反射良好,但間接照明較差。

    • 可以停用間接照明,將其設定為整個探查的恆定顏色分佈,或自動從探查的環境中讀取(並作為立方體貼圖應用)。這本質上充當局部環境照明。反射和間接照明與其他附近的探頭混合。

      ReflectionProbe 的實際應用(沒有任何其他 GI 技術)。注意反射球體。

      ReflectionProbe 的實際應用(沒有任何其他 GI 技術)。注意反射球體。

即時光照:

  • VoxelGI: good 完全即時。

    • 間接關照和反射是完全即時的。動態物體可以接收 GI, 通過其發射表面對 GI 做出貢獻。自訂著色器也可以準確地發射自己的光線。

      適用於程式生成的關卡*如果它們是提前生成的*(而不是在遊戲過程中)。烘焙需要幾秒鐘或更長時間才能完成,但可以從編輯器和匯出的專案中完成。

  • **SDFGI:**走訪 半即時。

    • 級聯是即時生成的,使得 SDFGI 適用於程式生成的關卡(包括在遊戲過程中生成結構時)。

      動態物件可以「接收」GI,但不能「貢獻」它。發射照明僅在物件進入級聯時才會更新,因此它可能仍然適用於緩慢移動的物件。

  • **螢幕空間間接光照(SSIL):**good 完全即時。

    • SSIL 適用於靜態和動態燈光。它也適用於靜態和動態遮擋器(包括發射材料)。

  • **LightmapGI:**與 進行了烘焙,因此非即時。

    • 間接光照和 SH 反射都是烘焙的,無法在運作時更改。即時 GI 必須以其他方式模擬,例如即時位置燈。動態物件透過光探查接收間接光照,光探查可以自動或由使用者手動放置(LightmapProbe 節點)。對於程式產生的關卡不可行,因為只能從編輯器中烘焙光照貼圖。

  • **ReflectionProbe:**走訪 可選即時。

    • 預設情況下,移動探查時反射會更新。如果更新模式設定為**始終**(這很昂貴),它們會盡可能頻繁地更新。

    • 間接照明必須由使用者手動配置,但可以在運作時更改,而不會導致在幕後發生昂貴的計算。這使得 ReflectionProbes 對於程式產生的關卡是可行的。

使用者干預

  • **VoxelGI:**需要建立若干 VoxelGI 節點並烘焙。

    • 需要正確調整範圍才能獲得良好的結果。此外,旋轉節點並再次烘烤可以幫助消除某些情況下的洩漏或條紋偽影。烘焙時間很快 - 對於中等複雜度的場景,通常低於 10 秒。

  • **SDFGI:**非常少。

    • SDFGI是全自動的;它只需要在環境資源中啟用。唯一需要的手動工作是正確設定 MeshInstances 的烘焙模式屬性。不需要建立節點,也不需要烘焙。

  • **螢幕空間間接光照(SSIL):**非常少。

    • SSIL 是全自動的;它只需要在環境資源中啟用。不需要建立節點,也不需要烘焙。

  • **LightmapGI:**需要設定 UV2 並烘焙。

    • 必須在啟用 UV2 和光照貼圖產生的情況下重新匯入靜態網格物件。在專用 GPU 上,由於基於 GPU 的光照貼圖烘焙,烘焙時間相對較快 – 對於中等複雜度的場景,烘焙時間通常低於 1 分鐘。

  • **ReflectionProbe:**使用者手動放置。

總結

如果您不確定要使用哪種 GI 技術:

  • 對於桌上遊戲,最好先從 SDFGI <doc_using_sdfgi>` 開始,因為它需要最少的設定。如果需要的話,稍後再轉向其他 GI 技術。若要提高低階 GPU 和整合顯示卡的效能,請考慮在遊戲設定中新增一個選項來停用 SDFGI 或 VoxelGI <doc_using_voxel_gi>`。可以在環境資源中停用 SDFGI,並且可以透過隱藏 VoxelGI 節點來停用 VoxelGI。為了進一步改善高階設定的視覺效果,請在遊戲設定中新增一個啟用 SSIL 的選項。

  • 對於行動遊戲,LightmapGI <doc_using_lightmap_gi>` 和 ReflectionProbes <doc_reflection_probes>` 是唯一支援的選項。另請參閱:ref:doc_introduction_to_global_Illumination_alternatives

也參考

除了這份說明文件,你可能也會想看看 Godot Demo 專案

我應該在網格和燈光上使用哪種全域照明模式?

無論您使用哪種全域照明技術,都不存在普遍「更好」的全域照明模式。儘管如此,這裡還是一些關於網格的建議:

  • 對於靜態關卡幾何體,請使用**靜態**全域照明模式*(預設)*。

  • 對於小型動態幾何體和玩家/敵人,請使用**停用**全域照明模式。由於幾何體小於體素,小型動態幾何體將無法貢獻大量間接照明。如果您需要小型動態物件的間接照明,可以使用該物件的父級 OmniLight3D 或 SpotLight3D 節點進行模擬。

  • 對於*大型*動態關卡幾何體(例如移動中的火車),請使用**動態**全域照明模式。請注意,這僅對 VoxelGI 有效,因為 SDFGI 和 LightmapGI 不支援動態物件的全域照明。

以下是一些關於光烘焙模式的建議:

  • 對於靜態水平照明,請使用**靜態**烘焙模式。 **靜態**模式也適用於遊戲過程中變化不大的動態燈光,例如閃爍的火炬。

  • 對於短暫的動態效果(例如武器),請使用**禁用**烘焙模式來提高性能。

  • 對於長期動態效果(例如旋轉警報燈),請使用**動態**烘焙模式來提高品質*(預設)*。請注意,這僅對 VoxelGI 和 SDFGI 有效,因為 LightmapGI 不支援動態燈光的全域照明。

另外,也可以執行

如果上述的 GI 技術都不適合,仍然可以透過手動放置額外的燈光來模擬 GI <doc_faking_global_Illumination>`。這需要更多的手動工作,但如果做得正確,它可以提供良好的性能*和*良好的視覺效果。時至今日,這種方法仍在許多現代遊戲中使用。

當在使用 LightmapGI 不可行的情況下(例如程式產生的等級)針對低端硬體時,可能需要單獨依賴環境照明或恆定的環境光係數。這可能會導致更平坦的視覺效果,但調整環境光顏色和天空貢獻仍然可以在大多數情況下獲得可接受的結果。