序言
什麼是全域照明?
全域照明 是一個包羅萬象的術語,用於描述同時使用直接光(直接來自光源的光)和間接光(從表面反射的光)的照明系統。在 3D 算繪引擎中,全域照明是實作逼真照明的最重要元素之一。全局照明旨在模仿現實生活中光的行為方式,例如光在表面上反射以及光從發光材料發出。
在下面的範例中,整個場景由發光材質(頂部的白色方塊)照亮。背面的白色牆壁和天花板在靠近牆壁的地方被染成紅色和綠色,因為彩色牆壁上反射的光線被反射回場景的其餘部分。
全域照明包含幾個主要概念:
間接漫射照明
這是不隨相機角度而改變的照明。間接漫射照明有兩個主要來源:
光在表面上「反彈」。這種反射光會與材質的反照率顏色相乘。然後,反射的照明可以被其他表面反射,由於光衰減而減少影響。在現實生活中,光會反射無數次。然而,出於性能原因,這無法在遊戲引擎中模擬。相反,反彈次數通常限制為 1 或 2(或在烘焙光貼圖時最多為 16)。反射次數越多,陰影區域的光線衰減就越真實,但代價是效能降低或烘烤時間更長。
發光材料還可以發射可在表面反射的光。這相當於“區域照明”的一種形式。確定大小的區域將使用自己的表面發光,而不是使用 OmniLight3D 或 SpotLight3D 節點讓無限小的點發光。
直接漫射照明已經由光節點本身處理,這意味著全局照明演算法僅嘗試表示間接照明。
不同的全域照明技術在間接漫射光的表現精度上有所差異。詳情請參閱本頁底部的比較表。
為了提供小物件更準確的環境光遮擋,可以在 environment 設定中啟用螢幕空間環境光遮擋 (SSAO)。 SSAO 具有顯著的效能成本,因此在針對低階硬體時請確保已停用它。
備註
間接漫射光在沒有細緻紋理的場景中可能會產生色帶現象,導致光線漸層不順暢而出現肉眼可見的「階梯」效果。減緩這種現象的方法,請參考 3D 算繪限制文件中的 帶狀顏色 章節。
鏡面光照
鏡面照明也稱為“反射”。這是根據相機角度改變強度的照明。這種鏡面照明可以是「直接」或「間接」。
大多數全局照明技術都提供了算繪鏡面照明的方法。然而,不同技術算繪鏡面光照的精確度差異很大。有關更多信息,請參閱本頁底部的比較表。
為了提供小物件更準確的反射,可以在 environment 設定中啟用螢幕空間反射 (SSR)。 SSR 具有顯著的效能成本(甚至比 SSAO 更高),因此在針對低階硬體時請確保已停用它。
我該選用哪一種全域照明技術?
在確定要使用的全域照明 (GI) 技術時,需要牢記幾個標準:
性能。 與半實時或烘焙技術相比,實時 GI 技術通常更昂貴。請注意,GI 算繪的大部分成本都花在 GPU 上,而不是 CPU 上。
視覺效果。 除了表現不佳之外,即時 GI 技術通常無法提供最佳的視覺輸出。在大多數靜態場景中尤其如此,即時 GI 的動態功能不容易被注意到。如果最大化視覺品質是您的目標,烘焙技術通常會看起來更好,並且會減少漏光。
實時能力。 一些 GI 技術是完全實時的,而另一些則只是半實時或根本不是實時的。半實時技術具有全實時技術沒有的限制。例如,動態物件可能不會向場景提供發射照明。非即時技術不支援「任何」形式的動態 GI,因此如果需要,必須使用其他技術來偽造它(例如將位置光放置在發光錶面附近)。即時能力也會影響 GI 技術在程式產生關卡中的可行性。
需要使用者工作。 有些 GI 技術是全自動的,而其他技術則需要使用者仔細規劃和手動工作。根據您的時間預算,某些 GI 技術可能比其他技術更好。
以下是 Godot 中可用的所有全域照明技術的比較:
效能
按照效能從最快到最慢的順序:
ReflectionProbe:
將 ReflectionProbe 的更新模式設為 Always 時,效能開銷會比預設的 Once 高出許多。若使用 Once 模式,適合整合型顯示卡。所有算繪器皆可用。
LightmapGI:
燈光可以只烘焙間接光,也可針對每個燈光完全烘焙以進一步提升效能。可搭配混合配置(例如同時使用即時方向光與完全烘焙的位置光)。在烘焙前可開啟方向資訊以提升視覺效果,僅有少許效能損耗(但檔案大小會增加)。適合整合型顯示卡。所有算繪器皆支援,但烘焙光照貼圖需支援 RenderingDevice 的硬體。
VoxelGI:
可調整烘焙的細分數以平衡效能與畫質。VoxelGI 算繪品質可於專案設定中調整。算繪亦可選擇以半解析度執行(再線性放大),以大幅提升效能。在 Mobile 或相容性算繪器不可用。
螢幕空間間接光(SSIL):
SSIL 品質與模糊次數可於專案設定內調整。預設情況下,SSIL 以半解析度算繪(再線性放大),以確保合理的效能。於 Mobile 或相容性算繪器不可用。
SDFGI:
可調整級聯數量以平衡效能與畫質。每禎投射的光線數可於專案設定內調整。可選擇以半解析度算繪(再線性放大),以大幅提升效能。於 Mobile 或相容性算繪器不可用。
視覺效果
為了進行比較,這裡有一個未使用全域照明選項的 3D 場景:
沒有任何形式的全局照明的 3D 場景(只有恆定的環境照明)。相機附近的盒子和球體都是動態物體。
以下是 Godot 的各種全域照明技術的比較:
VoxelGI:
良好的反射和間接照明,但要小心洩漏。由於其基於體素的性質,如果牆壁和地板太薄,VoxelGI 將出現漏光。建議確保所有實體表面至少與一個體素一樣厚。
在傾斜的表面上也可能會看到條紋偽影。在這種情況下,調整偏移屬性或旋轉 VoxelGI 節點可以幫助解決這個問題。
VoxelGI 的實際應用。
SDFGI:
良好的反射和間接照明,但要注意洩漏和可見的級聯偏移。GI 細節等級會根據相機與表面之間的距離而變化。
透過啟用 使用遮蔽 屬性可以顯著減少洩漏。這具有較小的性能成本,但與 VoxelGI 相比,它通常會導致更少的洩漏。
當相機快速移動時,可能會看到級聯移位。透過調整級聯大小或使用霧氣可以使這種情況變得不那麼明顯。
SDFGI 實際效果展示。
螢幕空間間接照明 (SSIL):
良好的“次要”間接照明源,但沒有反射。SSIL 旨在用作另一種 GI 技術(例如 VoxelGI、SDFGI 或 LightmapGI)的補充。 SSIL 最適合小規模細節,因為它本身無法為大型結構提供準確的間接照明。在其他 GI 技術無法捕捉小尺度細節或動態物件的情況下,SSIL 可以提供即時間接照明。其螢幕空間性質會導致一些偽影,尤其是當物件進入和離開螢幕時。 SSIL 使用最後一影格的顏色(在後處理之前)工作,這意味著包含自發光裝飾和自訂著色器(只要它們出現在螢幕上)。
SSIL 的實際應用(沒有其他 GI 技術)。注意黃色框周圍的發射光。
LightmapGI:
出色的間接照明,良好的反射(可選)。這是唯一可以將光反射次數提高到 2 以上(最多 16 個)的技術。啟用方向資訊後,球諧函式 (SH) 用於提供模糊反射。
LightmapGI 的實際應用。這裡只烘焙間接光照,但也可以烘焙直接光照。
ReflectionProbe:
反射良好,但間接照明較差。可以停用間接照明,將其設定為整個探查的恆定顏色分佈,或自動從探查的環境中讀取(並作為立方體貼圖應用)。這本質上充當局部環境照明。反射和間接照明與其他附近的探頭混合。
ReflectionProbe 的實際應用(沒有任何其他 GI 技術)。注意反射球體。
即時性
VoxelGI:
完全即時。間接關照和反射是完全即時的。動態物體可以接收 GI, 並 通過其發射表面對 GI 做出貢獻。自訂著色器也可以準確地發射自己的光線。
適用於程式生成的關卡*如果它們是提前生成的*(而不是在遊戲過程中)。烘焙需要幾秒鐘或更長時間才能完成,但可以從編輯器和匯出的專案中完成。
SDFGI:
半即時。級聯是即時生成的,使得 SDFGI 適用於程式生成的關卡(包括在遊戲過程中生成結構時)。
動態物件可以「接收」GI,但不能「貢獻」它。發射照明僅在物件進入級聯時才會更新,因此它可能仍然適用於緩慢移動的物件。
螢幕空間間接光照(SSIL):
完全即時。SSIL 適用於靜態和動態燈光。它也適用於靜態和動態遮擋器(包括發射材料)。
LightmapGI:
進行了烘焙,因此非即時。間接光照和 SH 反射都是烘焙的,無法在運作時更改。即時 GI 必須 以其他方式模擬,例如即時位置燈。動態物件透過光探查接收間接光照,光探查可以自動或由使用者手動放置(LightmapProbe 節點)。對於程式產生的關卡不可行,因為只能從編輯器中烘焙光照貼圖。
ReflectionProbe:
可選即時。預設情況下,移動探查時反射會更新。如果更新模式設定為**始終**(這很昂貴),它們會盡可能頻繁地更新。
間接照明必須由使用者手動設定,但可以在執行時變更,而不會在幕後觸發昂貴的計算。這使得 ReflectionProbe 對於程序式生成關卡是可行的。
使用者需額外設定
VoxelGI: 需要建立若干 VoxelGI 節點並烘焙。
需要正確調整範圍才能獲得良好的結果。此外,旋轉節點並再次烘烤可以幫助消除某些情況下的洩漏或條紋偽影。烘焙時間很快 - 對於中等複雜度的場景,通常低於 10 秒。
SDFGI: 非常少。
SDFGI是全自動的;它只需要在環境資源中啟用。唯一需要的手動工作是正確設定 MeshInstances 的烘焙模式屬性。不需要建立節點,也不需要烘焙。
螢幕空間間接光照(SSIL): 非常少。
SSIL 是全自動的;它只需要在環境資源中啟用。不需要建立節點,也不需要烘焙。
LightmapGI: 需要設定 UV2 並烘焙。
必須在啟用 UV2 和光照貼圖產生的情況下重新匯入靜態網格物件。在專用 GPU 上,由於基於 GPU 的光照貼圖烘焙,烘焙時間相對較快 – 對於中等複雜度的場景,烘焙時間通常低於 1 分鐘。
ReflectionProbe: 使用者手動放置。
總結
如果您不確定要使用哪種 GI 技術:
對於桌上遊戲,最好先從 SDFGI 開始,因為它需要最少的設定。如果需要的話,稍後再轉向其他 GI 技術。若要提高低階 GPU 和整合顯示卡的效能,請考慮在遊戲設定中新增一個選項來停用 SDFGI 或 VoxelGI 。可以在環境資源中停用 SDFGI,並且可以透過隱藏 VoxelGI 節點來停用 VoxelGI。為了進一步改善高階設定的視覺效果,請在遊戲設定中新增一個啟用 SSIL 的選項。
對於行動遊戲, LightmapGI 和 ReflectionProbes 是唯一支援的選項。另請參閱 全域照明(GI)技術的替代方案 。
也參考
您可以使用 全域照明展示專案 來比較實際運作中的全域照明技術。
我應該在網格和燈光上使用哪種全域照明模式?
無論您使用哪種全域照明技術,都不存在普遍「更好」的全域照明模式。儘管如此,這裡還是一些關於網格的建議:
對於靜態關卡幾何體,請使用**靜態**全域照明模式*(預設)*。
對於小型動態幾何體和玩家/敵人,請使用**停用**全域照明模式。由於幾何體小於體素,小型動態幾何體將無法貢獻大量間接照明。如果您需要小型動態物件的間接照明,可以使用該物件的父級 OmniLight3D 或 SpotLight3D 節點進行模擬。
對於*大型*動態關卡幾何體(例如移動中的火車),請使用**動態**全域照明模式。請注意,這僅對 VoxelGI 有效,因為 SDFGI 和 LightmapGI 不支援動態物件的全域照明。
以下是一些關於光烘焙模式的建議:
對於靜態水平照明,請使用 靜態 烘焙模式。 靜態 模式也適用於遊戲過程中變化不大的動態燈光,例如閃爍的火炬。
對於短暫的動態效果(例如武器),請使用**禁用**烘焙模式來提高性能。
對於長期動態效果(例如旋轉警報燈),請使用**動態**烘焙模式來提高品質*(預設)*。請注意,這僅對 VoxelGI 和 SDFGI 有效,因為 LightmapGI 不支援動態燈光的全域照明。
全域照明(GI)技術的替代方案
如果上述的 GI 技術都不適合,仍然可以透過手動放置額外的燈光來 simulate GI by placing additional lights manually 。這需要更多的手動工作,但如果做得正確,它可以提供良好的性能*和*良好的視覺效果。時至今日,這種方法仍在許多現代遊戲中使用。
若目標平台為低階硬體,且無法使用 LightmapGI(例如程式化生成關卡),可能只能仰賴環境光或固定環境光因子。這會讓畫面較為平淡,但仍可透過調整環境光顏色與天空亮度來取得大部分情境下可接受的效果。