Up to date

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

偽造全域光照

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

Godot 提供了多種全域照明 (GI) 技術,各有其優點和缺點。儘管如此,仍然可以避免使用任何地理旗標技術並使用手工製作方法。使用「手工」方法進行全域照明而不是 VoxelGI、SDFGI 或烘焙光照貼圖有幾個原因:

  • 您需要具有良好的渲染性能,但無法承受潛在繁瑣的光照貼圖烘焙過程。

  • 您需要一種完全即時*且*可在程式產生的關卡中運作的 GI 方法。

  • 您需要一種完全即時的 GI 方法*並且*不會出現明顯的漏光問題。

以下所述的方法僅涵蓋間接漫射照明,而不涵蓋鏡面照明。對於鏡面照明,請考慮使用 ReflectionProbes,它通常足夠便宜,可以與這種假 GI 方法結合使用。

也參考

不確定用燈光偽造全域照明是否適合您的需求?請參閱 doc_introduction_to_global_Illumination_comparison` 以了解 Godot 4 中可用的 GI 技術的比較。

偽造 DirectionalLight3D 的全域光照

雖然天空提供自己的定向照明,但場景的主要 DirectionalLight3D 節點通常會發出大量的光。當使用 GI 技術時,這種光會在固體表面上反射,並會在大多數戶外陰影表面上反射回來。

我們也可以通過在第一個向量的末尾加上第二個向量來直觀地看到這一點:

  • 將燈光旋轉 180 度。這使得它能夠表示由主 DirectionalLight3D 節點反射的光照。

  • 陰影 設定為 關閉。這減少了輔助光的性能負擔,同時還允許陰影區域接收“一些”照明(這就是我們在這裡想要的)。

  • 將**能量**設定為原始值的 10-40%。不存在“完美”值,因此請根據光線和典型材質顏色嘗試各種能量值。

  • 鏡面 設定為“0.0”。間接照明不應發出可見的鏡面光波瓣,因此我們需要完全停用輔助光的鏡面照明。

備註

這種方法最適合大多數戶外場景。當進入室內時,輔助 DirectionalLight3D 的燈光仍然可見,因為該燈光禁用了陰影。

這可以透過在進入室內區域時平滑地減少輔助 DirectionalLight3D 的能量(並在離開室內區域時執行相反的操作)來解決。例如,這可以使用 Area3D 節點和 AnimationPlayer 來實作。

偽造位置燈光的全域光照

對於位置光源(OmniLight3D 和 SpotLight3D),可以採用與 DirectionalLight3D 相同的方法。然而,這將需要更多的手動工作,因為需要對場景中的每個位置光節點重複此操作才能看起來不錯。

在理想情況下,應在大量光線照射到足夠明亮表面的每個位置新增額外的 OmniLight3D。然而,由於時間限制,這並不總是容易實作(特別是在執行程式關卡產生時)。

如果您趕時間,可以將輔助 OmniLight3D 節點放置在與主 OmniLight3D 節點相同的位置。您可以將此節點新增為主 OmniLight3D 節點的子節點,以便輕鬆同時移動並隱藏這兩個節點。

在輔助 OmniLight3D 節點中,執行下列變更:

  • 將燈光的**範圍**增加 25-50%。這使得輔助光能夠照亮先前未被原始光照亮的區域。

  • 陰影 設定為 關閉。這減少了輔助光的性能負擔,同時還允許陰影區域接收“一些”照明(這就是我們在這裡想要的)。

  • 將**能量**設定為原始值的 10-40%。不存在“完美”值,因此請根據光線及其周圍環境嘗試各種能量值。

  • Specular 設為 0。間接照明不應發出可見的鏡面反射波瓣,因此我們需要完全停用輔助光的鏡面反射照明。

對於 SpotLight3D,可以使用相同的技巧。在這種情況下,輔助 OmniLight3D 的放置方式應能反射「大多數」光線將被反射的位置。這通常靠近 SpotLight3D 的主要影響位置。

在下面的範例中,SpotLight3D 節點用於照亮房間的地板。然而,由於沒有間接照明,房間的其餘部分仍然完全黑暗。在現實生活中,房間的牆壁和天花板會被周圍反射的光線照亮。使用位於 SpotLight3D 的原點和地板之間的 OmniLight3D 節點可以模擬此效果:

../../../_images/faking_global_illumination_comparison.webp