使用光照貼圖全域光照
烘焙光照貼圖是一種為場景增加間接(或全烘焙)光源的工作流程。與 VoxelGI 和 SDFGI 方法不同,烘焙光照貼圖在低階 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 已啟用(直接和間接光照烘焙)。最佳性能,但視覺品質較低。請注意右上角較模糊的太陽陰影。
以下是 BakedLightmap 和 GIProbe 的一些顯示效果比較。可以看到光照貼圖更精確,但由於使用的是展開後的紋理,所以過渡以及解析度可能就沒有那麼理想。GIProbe 看上去沒有那麼精確(因為是近似估算),但總體上更平滑。
與 LightmapGI 相比,SDFGI 的準確度也較低。然而,SDFGI 可以支援大型開放世界,而不需要任何烘焙。
設定
警告
由於圖形 API 限制,網頁版編輯器不支援烘焙光照貼圖。在網頁平台上,只支援 顯示 於其他平台烘焙好的光照貼圖。
備註
LightmapGI 節點只會烘焙與自身同一層級(兄弟)或作為其子節點的物件。這讓你能以多個 LightmapGI 節點分開烘焙場景的不同區塊,各自獨立互不影響。
首先,進行光照貼圖前,所有要被烘焙的物件都必須有 UV2 圖層與設定紋理大小。UV2 圖層是一組次要紋理座標,能確保每個面的頂點都在 UV 貼圖上有獨立區塊,不能有多個面共用同一組貼圖像素。
這裡有幾種方法可以確保您的物件具有唯一的 UV2 層和紋理大小:
場景匯入時展開
總體來說,這可能是最好的方法。唯一的缺點是,在大型模型上,匯入時展開可能需要一段時間。不過Godot會在重新匯入時快取UV2,所以只會在需要時重新生成。
在檔案系統面板中選擇被匯入的場景,然後切換到**匯入**面板。這裡可以修改以下選項:
網格 > 光照烘焙**選項必須設定為 **靜態光照貼圖 (VoxelGI/SDFGI/LightmapGI):
匯入時展開時,您可以使用 網格 > 光照貼圖紋素大小 選項調整紋理大小。 較低的 值將產生更詳細的光照貼圖,可能會導致更高的視覺質量,但代價是更長的烘焙時間和更大的光照貼圖檔案大小。預設值 0.2 適用於小型/中型場景,但您可能需要將其增加到 0.5 ,甚至更大的場景。如果您僅烘焙間接光照,則尤其如此,因為間接光是低頻資料(這意味著它不需要準確表示高解析度紋理)。
設定此選項的效果是場景中的所有網格都將正確生成其UV2貼圖.
警告
如果在場景中複用了網格,請注意生成 UV 時只會使用第一個找到的實例。如果複用時使用了不同的縮放比例(並且相差很大,超過了一半或者兩倍),會導致生成低效的光照貼圖。如果你想用光照貼圖,就不要在複用原始網格時使用明顯不同的縮放比例。
另外,請*不要*在版本控制系統中忽略 *.unwrap_cache 檔,這些檔可以用來保證不同平臺、不同版本的引擎在重新匯入 UV2 時的一致性。
使用 Godot 進行展開
警告
如果在匯入的 3D 場景上使用此 Mesh 選單操作,則重新載入場景時產生的 UV2 將會遺失。
Godot可以選擇打開網格並視覺化UV通道. 它可以在Mesh功能表中找到:
這將生成第二組UV2座標, 可用於烘焙, 並且還將自動設定紋理大小.
使用 3D DCC 展開
最後一種方法是在你喜歡的 3D 應用程式中進行操作。通常不推薦這種做法,但為了讓你知道它的存在,這裡還是解釋一下。這種做法的主要優勢在於,針對可能要經常重新匯入的複雜物件,在 Godot 中進行紋理生成的代價可能相當高,所以在匯入前展開可以提高速度。
只需在第二個UV2層上進行展開即可。
然後正常匯入 3D 場景。記得在匯入後為網格設定紋理大小。
如果在匯入時使用外部網格, 則將保留大小. 請注意,3D DCC中的大多數解包器都不是面向品質的, 因為它們可以快速工作. 您通常需要使用接縫或其他技術來建立更好的展開.
為基本網格產生 UV2
備註
此選項僅適用於基本網格體,例如 BoxMesh 、 CylinderMesh 、 PlaneMesh 等。
在原始網格體上啟用 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座標:
設定場景
首先需要在場景中新增一個 BakedLightmap 節點。新增後,場景中的所有節點(和子節點)就都可以進行光照烘焙了,甚至產生實體的場景也可以。
烘焙器支援同一子場景存在多個實例,它們會有各自獨立的光照貼圖(前提是你得遵守之前提過的關於縮放的規則)。
設定網格
若要讓 MeshInstance3D 節點參與光照貼圖烘焙,必須將其烘焙模式設為 靜態。若烘焙模式為 停用 或 動態,該網格將不會被光照貼圖器處理。
在場景匯入時自動生成光照貼圖時, 會自動啟用此功能.
設定燈光
預設情況下, 燈光採用間接燈光烘焙. 這意味著陰影貼圖和光照仍然是動態的並影響移動的物體, 但是光線反射的光將被烘焙.
燈可以禁用(不烘焙)或完全烘焙(直接和間接). 這可以通過燈光中的 烘焙模式 功能表進行控制:
模式有:
已停用的專案
這個模式會在烘焙光照貼圖時忽略該燈光。通常用於動態燈光效果,如爆炸或武器特效。
警告
將燈光設為隱藏對光照貼圖烘焙結果毫無影響。這代表你必須用「停用」烘焙模式,而不是僅僅將燈光節點的 Visible 屬性關閉。
動態語言:
這是預設的模式,是性能與即時友好性的折衷。只會烘焙間接光照。直接燈光和陰影仍舊是即時的,與不使用 BakedLightmap 時一致。
這個模式可以在保持顯示效果相對正確的同時,允許進行燈光顏色、能量、以及位置的 微調 。例如,你可以借此實作靜態火把的閃爍,它的間接光照仍然是烘焙的。
依據 Shadowmask Mode 設定,你仍可以讓 DirectionalLight3D 生成遠處的烘焙陰影。如此一來,近距離的陰影仍為即時渲染,可投射動態物件陰影,而遠處的靜態物件則仍能保有烘焙陰影。
靜態語言:
間接和直接光照都會被烘焙。因為靜態表面可以完全跳過光照和陰影的計算,所以這個模式可以提供最佳的性能,並且實作不隨距離衰減的平滑的陰影。即時燈光不會再影響烘焙的表面,但仍然可以影響動態的物件。在光源上使用 All (全部)烘焙模式時,動態物件不會在烘焙表面上投射陰影,所以你需要使用別的方法,比如軟陰影。軟陰影既可以通過 Sprite3D + RayCast 實作,也可以通過把朝下的反 SpotLight 的烘焙模式設定成 禁用 實作。
遊戲過程中無法調整燈光。燈光的移動、變色、能量調整不會對靜態表面產生影響。
因為烘焙模式可以分光源調整,所以可以設定出混合的烘焙光照。一個比較流行的做法是使用即時 DirectionalLight 並把它的烘焙模式設定成 Indirect,然後把 OmniLight 和 SpotLight 的烘焙模式都設定成 All。這樣做的性能不錯,同時也允許動態物件在室外投射即時陰影。
完全烘焙的燈光還可以利用燈光節點的**大小**(全向/聚光)或**角度距離**(方向)屬性。這允許陰影具有真實的半影,隨著施法者和陰影之間距離的增加,半影的尺寸也會增加。與即時 PCSS 陰影相比,這也具有較低的效能成本,因為只有動態物件才會在其上算繪即時陰影。
烘焙
開始烘焙只需在選中 BakedLightmap 節點後點擊上方的 烘焙光照貼圖 按鈕:
根據場景大小、所選烘焙方法以及品質的不同,其過程可能花費幾秒鐘到幾分鐘不等(也可能是幾小時)。
警告
烘焙光照貼圖是一個可能需要大量視訊記憶體的過程,尤其是當產生的紋理很大時。由於內部限制,如果生成的紋理尺寸太大(即使在具有大量視訊記憶體的系統上),引擎也可能當機。
為了避免當機,請確保匯入停靠列中的光照貼圖紋理像素大小設定為足夠高的值。
調整
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 降噪強度的比較。強度越高,細節損失越明顯。
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 降噪效果比較。你會發現 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 個實例,部分就會開始閃爍。