Up to date

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

體積霧和霧體積

備註

只有“集群 Forward”渲染後端支援體積霧,“Forward 移動”和“相容”不支援。

環境和後期處理 中已經介紹過,Godot 支援的各種視覺效果中包含兩種霧:傳統(非體積)霧和體積霧。傳統霧會影響整個場景,無法使用 著色器 進行自訂。

如果需要,體積霧可以和非體積霧一同使用。

在本指南中,我們將學到:

  • 如何在 Godot 中設定體積霧。

  • 霧體積是什麼,和“全域”體積霧有什麼區別。

也參考

除了這份說明文件,你可能也會想看看 Godot Demo 專案

以下是傳統霧(不與光照互動)和體積霧(能夠與光照互動)之間的比較:

../../_images/volumetric_fog_comparison.png

建立屬性群組

在 WorldEnvironment 節點的 Environment 資源中啟用體積霧之後,可以編輯以下屬性:

  • **Density:**密度。體積霧的基礎*指數*密度。請將這個值設定為你想要的全域最低密度。可以在特定區域中使用 FogVolume 來增加或減少這個密度。設為 0.0 會禁用全域體積霧,但仍然可以在特定區域中使用 FogVolume 來顯示體積霧。霧的渲染呈指數效果,和現實生活中一致。

  • **Albedo:**反照率。體積霧在與燈光互動時的顏色。霧的反照率接近於白色(Color(1, 1, 1, 1)),而煙的反照率要更暗一些。

  • **Emission:**自發光。體積霧發出的光。啟用了自發光的體積霧並不會向其它表面發射光線。自發光常用於實作環境光。因為體積霧效果只使用單散射,所以霧需要有一點點自發光才能柔化陰影。

  • **Emission Energy:**自發光能量。體積霧發出的光的亮度。

  • **GI Inject:**GI 注入。對體積霧在全域光照中使用的反照率顏色強度進行縮放。設為 0.0 意味著全域光照不影響體積霧。設為大於 0.0 的值時對影響略有影響。

  • 各向異性: 散射光穿過體積霧時的方向。接近“1.0”的值意味著幾乎所有光都向前散射。接近“0.0”的值意味著光在各個方向上均勻散射。接近“-1.0”的值意味著光大部分向後散射。霧和薄霧將光線稍微向前散射,而煙霧則將光線均勻地向各個方向散射。

  • 長度: 計算體積霧的距離。增加以在更大範圍內計算霧,減少以在不需要長範圍時新增更多細節。為了獲得最佳品質的霧,請將其保持盡可能低。

  • 細節分佈: froxel 緩衝區長度上的大小分佈。較高的值會壓縮 Froxels 使其更靠近相機,並將更多細節放置在更靠近相機的位置。

  • 環境注入: 縮放體積霧中使用的環境光的強度。值“0.0”表示環境光不會影響體積霧。當設定高於“0.0”時,效能成本很小。

  • 天空影響: 控制應在背景天空上繪製多少體積霧。如果設定為“0.0”,體積霧根本不會影響天空渲染(包括 FogVolumes)。

**時間重投影**部分提供了兩個附加屬性:

  • 時間重投影 > 已啟用: 在體積霧中啟用時間重投影。時間重投影將目前影格的體積霧與上一格的體積霧混合以平滑鋸齒狀邊緣。性能成本很小,但它確實會導致移動 FogVolume 和 Light3D 出現「重影」並留下痕跡。啟用時間重投影時,盡量避免 FogVolume 或 Light3D 移動得太快。短暫的動態照明效果應將**體積霧能量**設為「0.0」以避免重影。

  • 時間重投影 > 數量: 最後一影格與目前影格的混合量。數值越高,體積霧越平滑,但「重影」會更嚴重。較低的值可減少重影,但會導致每個畫面時間抖動變得可見。

備註

與非體積霧不同,體積霧具有“有限”範圍。這意味著體積霧無法完全覆蓋一個大世界,因為它最終將停止在遠處渲染。

如果您希望對玩家隱藏較遠的區域,建議同時啟用非體積霧和體積霧,並相應地調整其密度。

與光互動

為了模擬現實生活中的霧光散射行為,所有光型別都將與體積霧相互作用。每個燈光對體積霧的影響程度可以使用每個燈光的 體積霧能量 屬性進行調整。在燈光上啟用陰影也會使這些陰影在體積霧中可見。

如果出於藝術原因不需要霧燈互動,可以透過在環境資源中將**體積霧 > 反照率**設定為純黑色來全域停用霧燈互動。也可以將其**體積霧能量**設為“0”來停用特定燈光的霧燈互動。這樣做還可以透過從體積霧計算中排除光線來稍微提高性能。

使用體積霧作為體積照明解決方案

雖然物理上不準確,但可以調整體積霧的設定以用作體積*照明*解決方案。這意味著環境中未照亮的部分將不再因霧而變暗,但光仍然能夠使特定區域的霧氣變得更亮。

這可以透過將體積霧密度設定為最低允許值*大於零*(「0.0001」),然後將燈光的「體積霧能量」屬性增加到比預設值高得多的值來進行補償。 10000 和``100000`` 之間的值通常對此效果很好。

../../_images/volumetric_fog_lighting.png

平衡性能與品質

有一些專案設定可用於調整體積霧性能和品質:

  • 渲染 > 環境 > 體積霧 > 體積大小: 用於確定相機 X 軸和 Y 軸中 froxel 緩衝區大小的基本大小。最終尺寸會根據螢幕的寬高比進行縮放,因此實際值可能與設定值有所不同。設定較大的尺寸以獲得更詳細的霧,設定較小的尺寸以獲得更好的性能。

  • 渲染 > 環境 > 體積霧 > 體積深度: 沿著體積霧的 froxel 緩衝區深度所使用的切片數量。數字越低效率越高,但可能會導致相機移動期間出現偽影。

  • 渲染 > 環境 > 體積霧 > 使用濾鏡: 在整合之前啟用體積霧效果的篩選。這大大模糊了霧,減少了精細細節,但也平滑了粗糙的邊緣和鋸齒偽影。當需要更多詳細資訊時禁用。

使用霧體積進行局部體積霧

有時,您希望將霧限制在特定區域。相反,您可能希望擁有全域體積霧,但應將霧排除在某些區域之外。這兩種方法都可以使用 FogVolume 節點來遵循。

以下是使用 FogVolumes 的快速入門指南:

  • 確保在環境屬性中啟用**體積霧**。如果不需要全域體積霧,請將其**密度**設為「0.0」。

  • 建立自定節點

  • 將新的 FogMaterial 指派給 FogVolume 節點的 Material 屬性。

  • 在 FogMaterial 中,將 Density 設定為正值以增加 FogVolume 內的密度,或設定為負值以從全域體積霧中減去密度。

  • 根據需要配置 FogVolume 的範圍和形狀。

備註

當相機移動或旋轉時,薄霧體積可能會出現閃爍。這可以透過增加**渲染> 環境> 體積霧> 體積深度** 專案設定(以效能成本)或透過減少環境體積霧屬性中的**長度**(沒有效能成本,但以效能為代價)來緩解。較低霧範圍的成本)。或者,可以將 FogVolume 做得更厚,並在**材質**中使用較低的密度。

節點屬性

  • 範圍:**當 **ShapeEllipsoidConeCylinderBox 時 FogVolume 的大小。如果 形狀圓錐體圓柱體,圓錐體/圓柱體將被調整以適應範圍。不支援透過 Extents 屬性對圓錐體/圓柱體形狀進行非均勻縮放,但您可以改為縮放 FogVolume 節點。

  • 形狀: FogVolume 的形狀。可設定為 EllipsoidConeCylinderBoxWorld (作為全域體積霧)。

  • 材質: FogVolume 使用的材質。可以是內建 FogMaterial 或自訂 ShaderMaterial (著色器)。

在**Material**屬性中選擇**New FogMaterial**後,您可以在FogMaterial中調整以下屬性:

  • 密度: FogVolume 的密度。密度較大的物件更加不透明,但可能會出現看起來像條紋的取樣不足的偽影。負值可用於從其他 FogVolume 或全域體積霧中減去霧氣。

  • 反照率: FogVolume 的單散射顏色。在內部,成員反照率轉換為單一散射,與其他 FogVolume 和全域體積霧的 反照率 相加混合。

  • 發射: FogVolume 發出的光的顏色。發射的光不會在其他物件上投射光或陰影,但可用於獨立於光源調變 FogVolume 的顏色。

  • 高度衰減: 隨著世界空間中高度的增加,基於高度的霧密度降低的速率。高衰減將導致急劇的過渡,而低衰減將導致更平滑的過渡。值“0.0”會產生均勻密度的霧。高度閾值由關聯的 FogVolume 的高度決定。

  • 邊緣淡入淡出: FogVolume 邊緣的硬度。較高的值將導致較柔和的邊緣,而較低的值將導致較硬的邊緣。

  • 密度紋理: 用於縮放 FogVolume 的成員密度的 3D 紋理。這可用於透過任何型別的靜態圖案來改變 FogVolume 內的霧密度。對於動畫效果,請考慮使用自訂霧著色器 <doc_fog_shader>`。您可以透過在匯入塢 <doc_importing_images_changing_import_type> 中變更其匯入型別,將任何影像匯入為 3D 紋理。

使用原型紋理

從 Godot 4.1 開始,有一個 NoiseTexture3D 資源可用於按程式產生 3D 雜訊。這非常適合 FogMaterial 密度紋理,可以產生更詳細的霧效果:

矩陣分量和單位矩陣

螢幕截圖是在 體積大小 專案設定設為 192 時拍攝的,以使高頻細節在霧中更加明顯。

為此,請選擇“密度紋理”屬性,然後選擇“新 NoiseTexture3D”。按一下此 NoiseTexture3D 進行編輯,然後按一下 NoiseTexture3D 屬性底部的 Noise 並選擇 New FastNoiseLite。根據霧體積的尺寸調整噪波紋理的寬度、高度和深度。

為了提高性能,建議使用較小的紋理尺寸(64×64×64 或更低),因為在 FogVolume 中很難注意到高頻細節。如果您希望表示更詳細的密度變化,則需要在專案設定中增加**渲染 > 環境 > 體積霧 > 體積大小**,這會產生效能成本。

備註

NoiseTexture3D 的 顏色漸層 會影響 FogMaterial 密度紋理,但由於僅對紋理的紅色通道進行取樣,因此只有顏色漸變的紅色通道會影響生成的密度。

但是,使用顏色漸變將*不會*根據紋理對霧量進行著色。您需要使用讀取Texture3D 的自訂著色器來實作此目的。

自定功能

本頁面僅涵蓋 FogMaterial 提供的內建設定。如果您需要在 FogVolume 節點內自訂霧行為(例如建立動畫霧),可以使用 doc_fog_shader 自訂 FogVolume 節點的外觀。

使用四邊形偽造體積霧

在某些情況下,最好使用專門配置的 QuadMeshes 作為體積霧的替代方案:

  • Quad 可與任何渲染方法搭配使用,包括前向移動和相容性。

  • 四邊形不需要時間重投影即可看起來平滑,這使得它們適合快速移動的動態效果,例如雷射。它們還可以表示體積霧無法有效實作的小細節。

  • 四邊形通常比體積霧具有更低的性能成本。

雖然有一些不同的地方:

  • 霧效果的衰減不太真實,尤其是當相機進入霧中時。

  • 當精靈重疊時,可能會出現透明度排序問題。

  • 如果相機附近有很多精靈,效能不一定會比體積霧更好。

要建立基於 QuadMesh 的霧精靈:

  1. 建立一個 MeshInstance 節點,將其 Mesh 屬性設為 PlaneMesh 或 QuadMesh。將該網格的大小調整到與影片的長寬比一致(否則看上去就會變形)。

  2. 在 GeometryInstance 部分的 Material Override 屬性中新建一個 SpatialMaterial 資源。

  3. 在StandardMaterial3D中,將**Shading > Shading Mode**設定為**Unshaded**,Billboard > Mode**設定為**Enabled,啟用**Proximity Fade**並將**Distance Fade* 設定為* 像素阿爾法

  4. 反照率 > 紋理 設定為下面的紋理(右鍵單擊並選擇 另存為...):

    ../../_images/volumetric_fog_quad_mesh_texture.webp
  5. *設定反照率紋理後,請前往匯入底座,選擇紋理並將其壓縮模式變更為**無損**以提高品質。

霧的顏色使用 Albedo > Color 屬性設定;它的密度是使用顏色的 Alpha 通道設定的。為了獲得最佳結果,您必須根據 QuadMesh 的大小調整 Proximity Fade > DistanceDistance Fade > Max Distance

或者,如果您將四邊形放置在其所有角落都處於實體幾何形狀中的方式,則可以停用廣告看板。這對於相機無法進入的大型平面(例如無底坑)的霧化非常有用。