Up to date

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

有符號距離場全域照明 (SDFGI)

有符號距離場全域照明 (SDFGI) 是 Godot 4.0 中提供的新技術。它提供半實時全域照明,可縮放至任何世界尺寸並適用於程式生成的等級。

SDFGI 支援動態燈光,但*不*動態遮擋器或動態發射表面。因此,SDFGI 提供了比烘焙光照貼圖更好的即時能力,但比 VoxelGI 差。

從效能角度來看,SDFGI 是 Godot 中要求最高的全域照明技術之一。與 VoxelGI 一樣,仍有許多設定可用於調整其性能要求,但會犧牲品質。

重要

僅當使用 Forward Plus 渲染後端時才支援 SDFGI,而不是 Forward Mobile 或相容性後端。

也參考

不確定 SDFGI 是否適合您的需求?請參閱 doc_introduction_to_global_Illumination_comparison` 以了解Godot 4 中可用的 GI 技術的比較。

視覺比較

禁用 3D

禁用 3D

SDFGI 已啟用。

SDFGI 已啟用。

設定

在 Godot 中,SDFGI 是一種全域照明技術,只需最少的步驟即可實作:

  1. 確保您的 MeshInstance 節點在屬性面板中將其 Global Illumination > Mode 屬性設為 Static

  • 對於匯入的 3D 場景,在檔案系統擴充座中選擇 3D 場景檔案後,可以在匯入擴充座中配置烘焙模式。

  1. 新增一個 WorldEnvironment 節點並為其建立一個環境資源。

  2. 編輯環境資源,向下捲動到 SDFGI 部分並將其展開。

  3. 啟用 SDFGI > 已啟用。 SDFGI 會在相機移動時自動跟隨相機,因此您無需配置範圍(與 VoxelGI 不同)。

環境變數

在環境資源中,有幾個屬性可用於調整 SDFGI 外觀和品質:

  • 使用遮蔽: 如果啟用,SDFGI 將投射額外的光線來發現並減少漏光。這會產生效能成本,因此僅在您確實需要時才啟用此屬性。

  • 讀取天空光: 如果啟用,環境照明將在全域照明中表示。應在室外場景中啟用此功能,並在完全室內場景中停用此功能。

  • 反彈回饋: 預設情況下,使用 SDFGI 時間接照明僅反彈一次。將此值設為高於“0.0”將導致 SDFGI 多次反彈,從而以較小的性能成本提供更真實的間接照明。根據場景,敏感值通常在「0.3」和「1.0」之間。請注意,在某些場景中,高於「0.5」的值可能會導致無限回饋循環發生,導致場景在幾秒鐘內變得極其明亮。如果您的間接照明看起來“有斑點”,請考慮將該值增加到“0.0”以上,以獲得更均勻的照明。如果您的照明最終看起來太亮,請減少**能量**進行補償。

  • **級聯:**較高的值會產生更詳細的 GI 資訊(和/或更大的最大距離),但在 CPU 和 GPU 上的成本明顯更高。當相機快速移動時,擁有更多級聯的性能成本尤其會增加,因此如果您的相機移動快速,請考慮將其減少到“4”或更低。

  • 最小單元尺寸: 用於最近、最詳細級聯的最小 SDFGI 單元尺寸。較低的值會導致更準確的間接照明和反射,但代價是性能較低。調整此設定也會自動影響 Cascade 0 DistanceMax Distance

  • 級聯 0 距離: 最近、最詳細的級聯結束的距離。數值越大,最近的級聯過渡越不明顯,但代價是降低最近級聯的細節等級。調整此設定也會自動影響 最小像元大小最大距離

  • 最大距離: 控制計算有符號距離場的距離(對於最不詳細的級聯)。 SDFGI 超過此距離不會產生任何影響。該值應始終設定為低於相機的遠值,因為計算超過觀看距離的 SDFGI 沒有任何好處。調整此設定也會自動影響 最小像元大小級聯 0 距離

  • Y 比例: 控制 SDFGI 探查*垂直*分佈的距離。預設情況下,垂直傳播與水平傳播相同。然而,由於大多數遊戲場景不是高度垂直的,因此將 Y 比例設定為「75%」甚至「50%」可以提供更好的品質並減少漏光,而不會影響效能。

  • 能量: SDFGI 間接照明的亮度乘數。

  • 法線偏差: 用於 SDFGI 偵測射線反彈的法線偏差。與 探查偏差 不同,這只會增加相對於網格法線的值。這使得偏差調整更加細緻,避免無緣無故增加偏差太多。如果您發現間接照明或反射中出現條紋偽影,請增加此值。

  • 探測偏差: 用於 SDFGI 探測射線反彈的偏差。如果您發現間接照明或反射中出現條紋偽影,請增加此值。

產生金鑰儲存區

光發出的間接能量的量由其顏色、能量*和*間接能量屬性決定。要使特定燈光發出或多或少的間接能量而不影響燈光發出的直接光量,請在 Light3D 屬性面板中調整 間接能量 屬性。

為了確保使用 SDFGI 時獲得正確的視覺效果,您必須根據場景中的「用途」(靜態或動態)配置網格和燈光的全域照明屬性。

有四種可用於取得設定的巨集:

  • 停用: SDFGI 生成中不會考慮網格。網格物件將接收來自場景的間接光照,但不會向場景貢獻間接光照。

  • 靜態(預設): SDFGI 生成中將考慮網格。網格將接收*並*為場景提供間接照明。如果在生成 SDFGI 後網格以任何方式發生更改,則相機必須遠離物件然後移回靠近對象,以便 SDFGI 重新生成。或者,可以關閉然後重新開啟 SDFGI。如果兩者都不做,間接照明就會看起來不正確。

  • 動態(SDFGI 不支援): SDFGI 生成中不會考慮網格。網格物件將接收來自場景的間接光照,但不會向場景貢獻間接光照。 這與使用 SDFGI 時的 **禁用* 烘焙模式相同。*

此外,還有 3 種可用於燈光的烘焙模式(DirectionalLight3D、OmniLight3D 和 SpotLight3D):

  • 停用: SDFGI 烘焙不會考慮光線。此燈光不會為場景提供間接照明。

  • 靜態: SDFGI 烘焙時將考慮光線。燈光將為場景提供間接照明。如果烘焙後燈光以任何方式發生變化,間接照明將看起來不正確,直到相機遠離燈光並返回(這會導致 SDFGI 再次烘焙)。會看起來不正確。如果有疑問,請使用此模式進行水平照明。

  • 動態(預設): SDFGI 烘焙不會考慮燈光,但它仍會即時為場景提供間接照明。與 靜態 相比,此選項速度較慢。僅對遊戲過程中會發生顯著變化的燈光使用**動態**全域照明模式。

備註

光發出的間接能量的量取決於其顏色、能量*和*間接能量屬性。要使特定燈光發出或多或少的間接能量而不影響燈光發出的直接光量,請在 Light3D 屬性面板中調整 間接能量 屬性。

調整 SDFGI 性能和品質

由於 SDFGI 要求相對較高,因此它在配備最新專用 GPU 的系統上表現最佳。在較舊的專用 GPU 和整合式顯示卡上,需要調整設定才能獲得合理的效能。

在「專案設定」的 渲染 > 全域照明 部分中,也可以透過多種方式調整 SDFGI 品質:

  • Sdfgi > 偵測光線計數: 值越高,品質越好,但代價是 GPU 使用率較高。如果該值設定得太低,則由於投射的光線數量非常少,可能會導致表面上出現可見的間接照明「斑點」。

  • Sdfgi > 收斂影格數: 值越高,品質越好,但 GI 需要更多時間才能完全收斂。當首次加載場景時,或者當具有除**禁用**之外的烘焙模式的燈光快速移動時,此設定的效果尤其明顯。如果該值設定得太低,則由於投射的光線數量非常少,可能會導致表面上出現可見的間接照明「斑點」。如果您的場景照明沒有有助於 GI 的快速移動燈光,請考慮將其設定為「30」以提高品質而不影響效能。

  • Sdfgi > 更新燈光的畫面: 較低的值會導致移動光反射得更快,但代價是 GPU 使用率較高。如果您的場景照明沒有有助於 GI 的快速移動燈光,請考慮將其設定為「16」以提高效能。

  • Gi > 使用一半解析度: 如果啟用,SDFGI 和 VoxelGI 都將以減半解析度渲染 GI 緩衝區。例如,當以 3840×2160 渲染時,GI 緩衝區將以 1920×1080 解析度計算。啟用此選項可以節省大量 GPU 時間,但它可能會在薄細節周圍引入可見的鋸齒。

SDFGI 渲染效能也取決於級聯數量和環境資源中所選的單元大小(請參閱上文)。

效能

由於其級聯性質,SDFGI 有一些缺點。當相機移動時,在間接照明下可能會看到級聯移位。這可以透過調整級聯大小來緩解,也可以透過新增霧(這將使遠處的級聯變化不那麼明顯)來緩解。

此外,如果相機移動太快,效能也會受到影響。這可以透過兩種方式解決:

  • 確保相機在任何給定情況下都不會移動得太快。

  • 如果相機需要高速移動,請暫時停用環境資源中的 SDFGI,然後在相機速度減慢時啟用 SDFGI。

當SDFGI啟用時,全域照明完全收斂也需要一些時間(預設25影格)。這可以在 GI 仍在收斂的同時產生明顯的過渡效果。若要隱藏這一點,您可以使用跨越整個視窗的 ColorRect 節點,並在使用 AnimationPlayer 節點切換場景時將其淡出。

只有當相機移入和移出級聯時,帶符號的距離場才會更新。這意味著,如果在遠處修改幾何形狀,一旦相機靠近,全局照明外觀將是正確的。但是,如果移動烘焙模式設定為**靜態**或**動態**的附近物件(例如門),則全域照明將顯示不正確,直到相機遠離該物件。

SDFGI 的銳利反射僅在不透明材料上可見。透明材質將僅使用粗糙反射,即使材質的粗糙度低於 0.2 也是如此。