使用光照貼圖全域光照

烘焙光照貼圖是一種為場景增加間接(或全烘焙)光源的工作流程。與 VoxelGISDFGI 方法不同,烘焙光照貼圖在低階 PC 與行動裝置上也能順利運作,因為執行時幾乎不消耗資源。此外,與 VoxelGI 與 SDFGI 不同,烘焙光照貼圖也可以選擇性地儲存直接光源,進一步提升效能。

烘焙光照貼圖與 GIProbe 不同,是完全靜態的,一旦被烘焙就完全不能被修改。它也不能為場景提供反射,所以如果要達到較好的畫質,在室內場景(或者是使用 Sky 的室外場景)中就需要和 反射探針 搭配使用。

由於是烘焙產生,相較於 VoxelGI 和 SDFGI,光滲問題較少,間接光看起來也更自然。不過,烘焙光照貼圖所需時間比 VoxelGI 長很多,VoxelGI 幾秒就能完成,光照貼圖可能需要數分鐘甚至更久。這會大幅拖慢反覆測試的速度,所以建議僅在確實需要檢查光照變化時再進行烘焙。自 Godot 4.0 起,光照貼圖會由 GPU 負責烘焙,若你有中高階獨顯將能更快完成。

烘焙光照貼圖時也會佔用材質的 UV2 通道,這表示你無法把 UV2 用於其他材質用途(不論是內建 標準 3D 材質與 ORM 3D 材質 還是自訂著色器)。

儘管缺乏靈活性,烘焙光照貼圖通常在(大部分)靜態場景中同時提供最佳品質*和*性能。這使得光照貼圖在遊戲開發中仍然很流行,儘管光照貼圖是電玩遊戲中最古老的全域照明技術。

也參考

不確定 LightmapGI 是否適合你的需求?請參閱 我該選用哪一種全域照明技術? 以比較 Godot 4 提供的各種 GI 技術。

視覺比較

LightmapGI 已停用。

LightmapGI 已停用。

LightmapGI 啟用(僅使用間接光烘焙)。

LightmapGI 啟用(僅使用間接光烘焙)。直射光仍然是即時的,允許在遊戲過程中發生微妙的變化。

LightmapGI 已啟用(直接和間接光照烘焙)。

LightmapGI 已啟用(直接和間接光照烘焙)。最佳性能,但視覺品質較低。請注意右上角較模糊的太陽陰影。

以下是 BakedLightmap 和 GIProbe 的一些顯示效果比較。可以看到光照貼圖更精確,但由於使用的是展開後的紋理,所以過渡以及解析度可能就沒有那麼理想。GIProbe 看上去沒有那麼精確(因為是近似估算),但總體上更平滑。

../../../_images/lightmap_gi_comparison.png

與 LightmapGI 相比,SDFGI 的準確度也較低。然而,SDFGI 可以支援大型開放世界,而不需要任何烘焙。

設定

警告

由於圖形 API 限制,網頁版編輯器不支援烘焙光照貼圖。在網頁平台上,只支援 顯示 於其他平台烘焙好的光照貼圖。

備註

LightmapGI 節點只會烘焙與自身同一層級(兄弟)或作為其子節點的物件。這讓你能以多個 LightmapGI 節點分開烘焙場景的不同區塊,各自獨立互不影響。

首先,進行光照貼圖前,所有要被烘焙的物件都必須有 UV2 圖層與設定紋理大小。UV2 圖層是一組次要紋理座標,能確保每個面的頂點都在 UV 貼圖上有獨立區塊,不能有多個面共用同一組貼圖像素。

這裡有幾種方法可以確保您的物件具有唯一的 UV2 層和紋理大小:

使用 Godot 進行展開

警告

如果在匯入的 3D 場景上使用此 Mesh 選單操作,則重新載入場景時產生的 UV2 將會遺失。

Godot可以選擇打開網格並視覺化UV通道. 它可以在Mesh功能表中找到:

../../../_images/lightmap_gi_mesh_menu.webp

這將生成第二組UV2座標, 可用於烘焙, 並且還將自動設定紋理大小.

使用 3D DCC 展開

最後一種方法是在你喜歡的 3D 應用程式中進行操作。通常不推薦這種做法,但為了讓你知道它的存在,這裡還是解釋一下。這種做法的主要優勢在於,針對可能要經常重新匯入的複雜物件,在 Godot 中進行紋理生成的代價可能相當高,所以在匯入前展開可以提高速度。

只需在第二個UV2層上進行展開即可。

../../../_images/lightmap_gi_blender.webp

然後正常匯入 3D 場景。記得在匯入後為網格設定紋理大小。

../../../_images/lightmap_gi_lmsize.webp

如果在匯入時使用外部網格, 則將保留大小. 請注意,3D DCC中的大多數解包器都不是面向品質的, 因為它們可以快速工作. 您通常需要使用接縫或其他技術來建立更好的展開.

為基本網格產生 UV2

備註

此選項僅適用於基本網格體,例如 BoxMeshCylinderMeshPlaneMesh 等。

在原始網格體上啟用 UV2 可以使它們接收並貢獻烘焙光照。這可以用於某些照明設定。例如,您可以在烘焙光貼圖後隱藏具有發光材質的圓環,以建立遵循圓環形狀的區域光。

預設情況下,原始網格體不會產生 UV2 以節省資源(因為這些網格體可能在遊戲過程中建立)。您可以在屬性檢視器中編輯基本網格並啟用**新增 UV2** 以使引擎按程式為基本網格產生 UV2。預設的 UV2 填充 值經過調整以避免大多數光照貼圖滲色,而不會在邊緣上浪費太多空間。如果您發現光照貼圖僅在特定基元網格上滲色,則可能需要增加 UV2 填充

光照貼圖大小提示 表示光照貼圖紋理上單一網格所佔據的大小,該大小會根據網格的大小屬性和 UV2 填充 值而變化。 光照貼圖大小提示 不應手動更改,因為重新載入場景時任何修改都會遺失。

為 CSG 節點產生 UV2

自 Godot 4.4 起,你可以 將 CSG 節點及其子節點轉換為 MeshInstance3D。這讓你可以依下列步驟,對 CSG 節點進行光照貼圖烘焙:

  • 選擇最上層的 CSG 節點,然後在 3D 編輯器上方選擇 CSG > 烘焙網格實例

  • 手動將剛剛烘焙的 CSG 節點隱藏(系統不會自動隱藏)。

  • 選取剛產生的 MeshInstance3D 節點,然後點選 Mesh > 為光照貼圖/環境光展開 UV2

  • 烘焙光照貼圖。

小訣竅

請記得保留原本的 CSG 節點於場景樹中,以便日後需要時能修改幾何形狀。若需變更幾何,將 MeshInstance3D 節點刪除,並將 CSG 節點重新顯示即可編輯。

檢查 UV2

在前面提到的網格功能表中, 可以顯示UV2紋理座標. 如果出現問題, 請確保檢查網格是否具有以下UV2座標:

../../../_images/lightmap_gi_uvchannel.webp

設定場景

首先需要在場景中新增一個 BakedLightmap 節點。新增後,場景中的所有節點(和子節點)就都可以進行光照烘焙了,甚至產生實體的場景也可以。

../../../_images/lightmap_gi_scene.webp

烘焙器支援同一子場景存在多個實例,它們會有各自獨立的光照貼圖(前提是你得遵守之前提過的關於縮放的規則)。

設定網格

若要讓 MeshInstance3D 節點參與光照貼圖烘焙,必須將其烘焙模式設為 靜態。若烘焙模式為 停用動態,該網格將不會被光照貼圖器處理。

../../../_images/lightmap_gi_use.webp

在場景匯入時自動生成光照貼圖時, 會自動啟用此功能.

設定燈光

預設情況下, 燈光採用間接燈光烘焙. 這意味著陰影貼圖和光照仍然是動態的並影響移動的物體, 但是光線反射的光將被烘焙.

燈可以禁用(不烘焙)或完全烘焙(直接和間接). 這可以通過燈光中的 烘焙模式 功能表進行控制:

../../../_images/lightmap_gi_bake_mode.webp

模式有:

已停用的專案

這個模式會在烘焙光照貼圖時忽略該燈光。通常用於動態燈光效果,如爆炸或武器特效。

警告

將燈光設為隱藏對光照貼圖烘焙結果毫無影響。這代表你必須用「停用」烘焙模式,而不是僅僅將燈光節點的 Visible 屬性關閉。

動態語言:

這是預設的模式,是性能與即時友好性的折衷。只會烘焙間接光照。直接燈光和陰影仍舊是即時的,與不使用 BakedLightmap 時一致。

這個模式可以在保持顯示效果相對正確的同時,允許進行燈光顏色、能量、以及位置的 微調 。例如,你可以借此實作靜態火把的閃爍,它的間接光照仍然是烘焙的。

依據 Shadowmask Mode 設定,你仍可以讓 DirectionalLight3D 生成遠處的烘焙陰影。如此一來,近距離的陰影仍為即時渲染,可投射動態物件陰影,而遠處的靜態物件則仍能保有烘焙陰影。

靜態語言:

間接和直接光照都會被烘焙。因為靜態表面可以完全跳過光照和陰影的計算,所以這個模式可以提供最佳的性能,並且實作不隨距離衰減的平滑的陰影。即時燈光不會再影響烘焙的表面,但仍然可以影響動態的物件。在光源上使用 All (全部)烘焙模式時,動態物件不會在烘焙表面上投射陰影,所以你需要使用別的方法,比如軟陰影。軟陰影既可以通過 Sprite3D + RayCast 實作,也可以通過把朝下的反 SpotLight 的烘焙模式設定成 禁用 實作。

遊戲過程中無法調整燈光。燈光的移動、變色、能量調整不會對靜態表面產生影響。

因為烘焙模式可以分光源調整,所以可以設定出混合的烘焙光照。一個比較流行的做法是使用即時 DirectionalLight 並把它的烘焙模式設定成 Indirect,然後把 OmniLight 和 SpotLight 的烘焙模式都設定成 All。這樣做的性能不錯,同時也允許動態物件在室外投射即時陰影。

完全烘焙的燈光還可以利用燈光節點的**大小**(全向/聚光)或**角度距離**(方向)屬性。這允許陰影具有真實的半影,隨著施法者和陰影之間距離的增加,半影的尺寸也會增加。與即時 PCSS 陰影相比,這也具有較低的效能成本,因為只有動態物件才會在其上算繪即時陰影。

../../../_images/lightmap_gi_omnilight_size.png

烘焙

開始烘焙只需在選中 BakedLightmap 節點後點擊上方的 烘焙光照貼圖 按鈕:

../../../_images/lightmap_gi_bake.webp

根據場景大小、所選烘焙方法以及品質的不同,其過程可能花費幾秒鐘到幾分鐘不等(也可能是幾小時)。

警告

烘焙光照貼圖是一個可能需要大量視訊記憶體的過程,尤其是當產生的紋理很大時。由於內部限制,如果生成的紋理尺寸太大(即使在具有大量視訊記憶體的系統上),引擎也可能當機。

為了避免當機,請確保匯入停靠列中的光照貼圖紋理像素大小設定為足夠高的值。

調整

  • Quality(品質):提供了四種烘焙品質:Low(低級)、Medium(中級)、High(高級)、Ultra(超級)。品質越高所需的時間越長,但最終光照貼圖的顯示效果越好、噪點也越少。針對發光材質或者幾乎沒有直接光照的地方,不同品質之間的區別尤為顯著。

  • 超取樣: 先以更高解析度生成光照貼圖,再進行降採樣。可減少雜訊與漏光,並在小尺度細節上產生更好的陰影。不過,這會增加烘焙時間與烘焙期間的記憶體占用。超取樣係數 會改變降採樣前光照貼圖的算繪尺寸。

  • 反彈次數: 控制間接光照的反射次數。預設值(3)在烘焙速度與品質之間取得良好平衡。提高此數值會讓光線在消散前多次反射,使間接光更柔順(但也可能因材質與幾何結構而變得更亮)。

  • 間接光能量倍增器: 烘焙燈光的間接能量時所使用的全域乘數。這會將每個燈光的 間接能量 屬性一併乘上。設定為 1.0 以外的值雖然不物理正確,但可用於創意演出。

  • 定向: 如果啟用,則儲存光照貼圖的方向資訊。這改善了烘焙表面的法線貼圖材質的外觀,尤其是在完全烘焙的燈光下(因為它們也有直接光線烘焙)。缺點是定向光照貼圖的算繪成本稍高。它們還需要更多的時間來烘烤並導致檔案大小更大。

  • 陰影遮罩模式: 若非設為 None,則場景中第一個設為 Dynamic 全域照明模式的 DirectionalLight3D,會將其靜態陰影烘焙到獨立的 shadowmask 紋理中。這讓遠距靜態物件無論與鏡頭距離多遠,仍可相互投影。詳細說明請參見 shadowmasking 章節

  • 內部: 若啟用,將不會取得環境照明。將其用於純室內場景以避免漏光。

  • 反彈用紋理: 啟用時,會產生包含光照資訊的紋理來加速間接光計算,但會犧牲部分精度。若使用低解析度光照貼圖或 UV 展開過度拉長,可能會有額外滲光偽影。不確定時建議保持啟用。

  • 使用降噪器: 啟用時,將以降噪演算法顯著減少光照貼圖的雜訊。這會延長烘焙時間,有時可能出現偽影,但通常值得啟用。詳見 降噪

  • 降噪強度: 控制套用於光照貼圖的降噪處理強度。數值越高,雜訊去除效果越顯著,但靜態陰影細節可能損失。僅在啟用降噪器且使用 JNLM 時有效,OIDN 沒有降噪強度選項。

  • Bias(偏置) :陰影的偏移量,使用 3D 單位。除非你遇到了光線滲透問題或者光照貼圖在烘焙後存在暗區,否則通常情況下不需要修改這個值。該選項不會影響投射在烘焙表面上的即時陰影。

  • 最大紋理尺寸: 產生的紋理合集的最大紋理尺寸。較高的值將導致產生的切片較少,但由於硬體對紋理大小的限制,可能無法在所有硬體上工作。如果不確定,請將其保留為預設值“16384”。

  • 環境 > 模式: 控制烘焙光照貼圖時環境光照的來源方式。 場景 的預設值適用於具有可見外部元件的關卡。對於純室內場景,將其設定為**停用**以避免漏光並加快烘烤速度。也可以設定為 自訂天空自訂顏色 以使用與實際場景的環境天空不同的環境照明。

  • 產生探查 > 細分: 請參閱 動態物件

  • 資料 > 光資料: 請參閱 光照貼圖資料

遠距方向性陰影的遮罩(Shadowmask)應用

當使用 DirectionalLight3D 時,其即時陰影的最大距離會受到 Shadow Max Distance 屬性的限制。在大型場景中,遠處的物件可能就無法顯示方向光的陰影。雖然可以將 DirectionalLight3D 的全域照明模式設為 靜態 來解決,但這麼做有幾個缺點:

  • 由於直接光和間接光都已烘焙,動態物件無法在靜態表面投射陰影,無法達到真實效果。Godot 為避免出現「雙重光照」偽影,在這種情況下會完全略過陰影取樣。

  • 近距離的靜態陰影細節會不足,因為只依賴光照貼圖,沒有即時陰影級聯的支援。

我們可以透過 shadowmasking (陰影遮罩)來避免這些缺點,同時又能享有遠距離陰影帶來的效果。雖然動態物件無法從遮罩獲得陰影,但大多數場景以靜態物件為主,因此整體視覺品質會明顯提升。

由於光照貼圖本身不包含陰影資訊,我們可以將陰影資料烘焙到另一張稱為 shadowmask (陰影遮罩)的紋理中。

陰影遮罩僅對場景中第一個設定為 動態 全域照明模式的 DirectionalLight3D 有效(依樹狀結構順序決定)。靜態 全域照明模式無法使用陰影遮罩,因為該模式會完全略過靜態物件的陰影取樣,這是因為靜態模式同時烘焙直接與間接光。

目前有三種陰影遮罩模式:

  • 無(預設): 不烘焙陰影遮罩紋理。超出 DirectionalLight3D 的 Shadow Max Distance 設定範圍外,將無法看到方向光的陰影。

  • 取代: 烘焙陰影遮罩紋理,並在超出 DirectionalLight3D 的 Shadow Max Distance 範圍時顯示方向光陰影。範圍內的陰影仍然為即時運算。這個選項適合大多數場景,特別是靜態物件可能有細微移動(例如樹葉陰影)時。

  • 疊加: 烘焙陰影遮罩紋理,不論與相機距離遠近都會顯示方向光陰影。在 DirectionalLight3D 的 Shadow Max Distance 範圍內,會將即時陰影與遮罩陰影疊加。這能讓即時與烘焙陰影切換時不那麼突兀,但靜態物件的陰影可能因像素密度不足而產生「模糊」效果。此外,這個模式不適合有細微移動的靜態物件(如樹葉),因為烘焙陰影無法隨時間變化。然而,若場景鏡頭移動很快,這選項有時比 取代 更實用。

以下為各種陰影遮罩模式的視覺比較(為了對照,Shadow Max Distance 設定得相當低)。藍色方塊代表動態物件,其餘皆為靜態物件。場景中僅有一個 DirectionalLight3D,且設為動態全域照明模式:

陰影遮罩模式之比較

陰影遮罩模式之比較

備註

你可以在 取代疊加 模式間切換,而無需重新烘焙光照貼圖。

平衡烘焙時間和品質

因為高品質的烘焙可能花費非常長的時間(大型複雜場景可能需要若干小時),推薦首先設定成較低品質,將場景中的燈光佈置成滿意的效果後再改成較高的品質,在匯出專案前進行“終極”烘焙。

透過增加匯入的 3D 場景上的 光照貼圖紋理尺寸 來降低光照貼圖解析度也會顯著加快烘焙速度。但是,這將要求您重新匯入所有光照貼圖 3D 場景,然後才能再次烘焙光照貼圖。

降噪

由於光照貼圖烘焙依賴於光線追蹤,『原始』烘焙出來的光照貼圖總會有明顯的雜訊。特別是在光線難以間接照射到的地方(如有小窗戶的室內),雜訊會更明顯。提升烘焙品質可減少雜訊,但同時會大幅增加烘焙時間。

降噪關閉與開啟時的比較

降噪關閉與開啟時(使用預設 JNLM 降噪器)的比較。

為了在不大幅延長烘焙時間的前提下減少雜訊,可以使用降噪器。降噪器是一種運作於最終烘焙光照貼圖上的演算法,會尋找雜訊並試圖在保留細節的前提下將其柔化。Godot 提供兩種降噪演算法:

JNLM(非區域性均值降噪,含聯合濾波)

JNLM 是 Godot 內建的預設降噪方法,採用一種稱為 非區域性均值 的簡單且高效演算法。JNLM 於 GPU 上以計算著色器運作,所有能運行 Godot 4 Vulkan 渲染的顯示卡皆可使用,無需額外設定。

啟用 使用降噪器 時,降噪強度 屬性可用來調整 JNLM 降噪效果。數值越高,雜訊去除越徹底,但靜態陰影細節也會損失。

不同 JNLM 降噪強度值的比較

不同 JNLM 降噪強度的比較。強度越高,細節損失越明顯。

OIDN(Open Image Denoise)

OIDN 與 JNLM 不同,採用機器學習方式進行光照貼圖降噪。其模型為光照貼圖去雜訊而特別訓練,較之 JNLM 能更好地保留大部分場景的陰影細節。

如果已設定硬體加速,OIDN 可於 GPU 上運作。現代高階顯示卡下,GPU 降噪速度可達 CPU 的 50 倍以上:

  • 若用 AMD 顯示卡,必須安裝並設定 HIP。

  • 若用 NVIDIA 顯示卡,必須安裝並設定 CUDA。NVIDIA 安裝程式通常會自動處理,但在 Linux 下預設可能未安裝 CUDA 函式庫,請確認你的發行版已安裝相關 CUDA 套件。

  • 若用 Intel 顯示卡,必須安裝並設定 SYCL。

如果無法使用硬體加速,OIDN 會自動切換為多執行緒 CPU 降噪。想確認 GPU 降噪是否有效,可在烘焙光照貼圖時用顯示卡監控工具檢查降噪階段的 GPU 使用率與 VRAM 占用。NVIDIA 用戶可用 nvidia-smi 指令檢查。

由於檔案較大,Godot 未內建 OIDN。你可以從其[官方網站](https://www.openimagedenoise.org/downloads.html)下載預編譯二進位包,解壓縮後,於編輯器設定(FileSystem > Tools > OIDN > OIDN Denoise Path)中指定 oidnDenoise 執行檔路徑。該執行檔位於你解壓縮資料夾裡的 bin 子資料夾中。

於專案設定將降噪方法改為 OIDN**(**Rendering > Lightmapping > Denoiser),即可在本專案所有光照貼圖烘焙時啟用 OIDN。

備註

降噪方法設於專案設定(非編輯器設定),這樣同一專案的不同成員可以確保結果一致,都使用同樣的降噪方式。

JNLM 與 OIDN 降噪器比較

JNLM 與 OIDN 降噪效果比較。你會發現 OIDN 能更好保留細節,並減少不同物件之間的接縫。

動態物件

與 VoxelGI 和 SDFGI 不同,動態物件接收間接光照的方式與靜態物件不同。這是因為光照貼圖僅在靜態物件上執行。

為了顯示動態物件上的間接照明,使用了 3D 探查系統,其中光探查遍布整個場景。烘焙光照貼圖時,光照貼圖器將計算探頭接收到的*間接*光量。直射光不會儲存在光探查中,即使對於將烘焙模式設定為**靜態**的光源(因為動態物件繼續即時點亮)。

有兩種方法可以為伺服器匯出專案:

  • 自動:Gen Probes > Subdiv 設定為 Disabled 以外的值,然後烘焙光照貼圖。預設值為“8”,但您可以選擇更大的值來提高精確度,但代價是烘焙時間更長且輸出檔案大小更大。

  • 手動: 除了自動產生探查之外或作為自動產生探查的替代方案,您可以透過向場景新增 LightmapProbe 節點來手動新增光照探查。這可用於改善動態物體經常經過的區域的照明細節。在場景中放置 LightmapProbe 節點後,必須再次烘焙光照貼圖才能使其生效。

備註

烘焙光照貼圖後,您會注意到 3D 場景中的白色球體代表烘焙光照將如何影響動態物件。這些球體**不會**出現在正在運作的專案中。

如果要在編輯器中隱藏這些球體,請在 3D 編輯器頂部切換 View > Gizmos > LightmapGI (「閉眼」圖示表示 Gizmo 已隱藏)。

光照貼圖資料

Light Data(光照資料) :烘焙後包含光照烘焙資料。紋理會被保存到磁片上,但這裡還會包含動態物件的捕獲資料,資料量可能非常大。如果你使用的是 .tscn 格式的場景,應該將此資源保存成外部的二進位 .lmbake 檔,否則 .tscn 場景可能因為使用 Base64 編碼二進位資料而變得巨大。

小訣竅

如果有後期處理的需要,可以使用圖像編輯器查看並編輯所生成的 EXR 檔。不過請注意,重新烘焙貼圖會覆蓋你對 EXR 檔的修改。

減少 LightmapGI 偽影

如果你發現隨著鏡頭移動,LightmapGI 節點會忽隱忽現,這很可能是因為同時可顯示的 LightmapGI 實例數量超過上限。Godot 最多同時渲染 8 個 LightmapGI 節點,若畫面中超過 8 個實例,部分就會開始閃爍。