Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
體積霧和霧體積
備註
體積霧僅支援於 Forward+ 渲染器,不支援 Mobile 或 Compatibility 渲染器。
環境與後製處理 中已經介紹過,Godot 支援的各種視覺效果中包含兩種霧:傳統(非體積)霧和體積霧。傳統霧會影響整個場景,無法使用 霧著色器 進行自訂。
如果需要,體積霧可以和非體積霧一同使用。
在本指南中,我們將學到:
如何在 Godot 中設定體積霧。
霧體積是什麼,和“全域”體積霧有什麼區別。
也參考
你可以透過 Volumetric Fog 範例專案 來看到體積霧的實際運作效果。
以下是傳統霧(不與光照互動)和體積霧(能夠與光照互動)之間的比較:
體積霧屬性
在 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”來停用特定燈光的霧燈互動。這樣做還可以透過從體積霧計算中排除光線來稍微提高性能。
使用體積霧作為體積照明解決方案
雖然物理上不準確,但可以調整體積霧的設定以用作體積*照明*解決方案。這意味著環境中未照亮的部分將不再因霧而變暗,但光仍然能夠使特定區域的霧氣變得更亮。
This can be done by setting volumetric fog density to the lowest permitted value
greater than zero (0.0001), then increasing the Volumetric Fog Energy
property on lights to much higher values than the default to compensate. Values
between 200.0 and 5000.0 usually work well for this.
平衡性能與品質
有一些專案設定可用於調整體積霧性能和品質:
算繪 > 環境 > 體積霧 > 體積大小: 用於確定相機 X 軸和 Y 軸中 froxel 緩衝區大小的基本大小。最終尺寸會根據螢幕的寬高比進行縮放,因此實際值可能與設定值有所不同。設定較大的尺寸以獲得更詳細的霧,設定較小的尺寸以獲得更好的性能。
繪圖 > 環境 > 體積霧 > 體積深度: 控制體積霧 froxel buffer 深度的切片數量。數值越低效能越好,但相機移動時可能產生偽影。
繪圖 > 環境 > 體積霧 > 使用濾鏡: 啟用後會在整合前對體積霧進行濾鏡處理,使霧效果更模糊(細節較少),但能平滑邊緣與減少鋸齒偽影。若需要更多細節可關閉。
備註
體積霧可能會在檢視畫面上產生條紋(banding),特別是在高密度設定時。請參閱 帶狀顏色 以了解如何減少條紋問題。
使用霧體積進行局部體積霧
有時你可能只希望在特定區域出現霧氣。相反地,你也可能希望有全域體積霧,但排除某些區域。這兩種需求都可以透過 FogVolume 節點來達成。
以下是使用 FogVolumes 的快速入門指南:
確保在環境屬性中啟用**體積霧**。如果不需要全域體積霧,請將其**密度**設為「0.0」。
建立一個 FogVolume 節點。
將新的 FogMaterial 指派給 FogVolume 節點的 Material 屬性。
在 FogMaterial 中,將 Density 設定為正值以增加 FogVolume 內的密度,或設定為負值以從全域體積霧中減去密度。
根據需要配置 FogVolume 的範圍和形狀。
備註
當相機移動或旋轉時,薄霧體積可能會出現閃爍。這可以透過增加**算繪> 環境> 體積霧> 體積深度** 專案設定(以效能成本)或透過減少環境體積霧屬性中的**長度**(沒有效能成本,但以效能為代價)來緩解。較低霧範圍的成本)。或者,可以將 FogVolume 做得更厚,並在**材質**中使用較低的密度。
節點屬性
範圍:**當 **Shape 為 Ellipsoid、Cone、Cylinder 或 Box 時 FogVolume 的大小。如果 形狀 是 圓錐體 或 圓柱體,圓錐體/圓柱體將被調整以適應範圍。不支援透過 Extents 屬性對圓錐體/圓柱體形狀進行非均勻縮放,但您可以改為縮放 FogVolume 節點。
形狀: FogVolume 的形狀。可設定為 Ellipsoid、Cone、Cylinder、Box 或 World (作為全域體積霧)。
材質: FogVolume 使用的材質。可以是內建 FogMaterial 或自訂 ShaderMaterial (霧著色器)。
在**Material**屬性中選擇**New FogMaterial**後,您可以在FogMaterial中調整以下屬性:
密度: FogVolume 的密度。密度較大的物件更加不透明,但可能會出現看起來像條紋的取樣不足的偽影。負值可用於從其他 FogVolume 或全域體積霧中減去霧氣。
反照率: FogVolume 的單散射顏色。在內部,成員反照率轉換為單一散射,與其他 FogVolume 和全域體積霧的 反照率 相加混合。
發射: FogVolume 發出的光的顏色。發射的光不會在其他物件上投射光或陰影,但可用於獨立於光源調變 FogVolume 的顏色。
高度衰減: 隨著世界空間中高度的增加,基於高度的霧密度降低的速率。高衰減將導致急劇的過渡,而低衰減將導致更平滑的過渡。值“0.0”會產生均勻密度的霧。高度閾值由關聯的 FogVolume 的高度決定。
邊緣淡入淡出: FogVolume 邊緣的硬度。較高的值將導致較柔和的邊緣,而較低的值將導致較硬的邊緣。
密度貼圖: 用於縮放 FogVolume 成員密度的 3D 貼圖。這可用於透過任何種類的靜態模式來變更 FogVolume 內的霧密度。至於動畫效果,考慮使用自訂的 體積霧著色器。您可以透過 在匯入面板中變更圖片的匯入類型,將任何圖片匯入為 3D 貼圖。
使用原型紋理
從 Godot 4.1 開始,有一個 NoiseTexture3D 資源可用於按程式產生 3D 雜訊。這非常適合 FogMaterial 密度紋理,可以產生更詳細的霧效果:
螢幕截圖是在 體積大小 專案設定設為 192 時拍攝的,以使高頻細節在霧中更加明顯。
為此,請選擇“密度紋理”屬性,然後選擇“新 NoiseTexture3D”。按一下此 NoiseTexture3D 進行編輯,然後按一下 NoiseTexture3D 屬性底部的 Noise 並選擇 New FastNoiseLite。根據霧體積的尺寸調整噪波紋理的寬度、高度和深度。
為了提高性能,建議使用較小的紋理尺寸(64×64×64 或更低),因為在 FogVolume 中很難注意到高頻細節。如果您希望表示更詳細的密度變化,則需要在專案設定中增加**算繪 > 環境 > 體積霧 > 體積大小**,這會產生效能成本。
備註
NoiseTexture3D 的 顏色漸層 會影響 FogMaterial 密度紋理,但由於僅對紋理的紅色通道進行取樣,因此只有顏色漸變的紅色通道會影響生成的密度。
但是,使用顏色漸變將*不會*根據紋理對霧量進行著色。您需要使用讀取Texture3D 的自訂著色器來實作此目的。
自定功能
此頁面僅涵蓋 FogMaterial 提供的內建設定。如果您需要在 FogVolume 節點中自訂霧氣行為 (例如建立動畫霧氣),FogVolume 節點的外觀可透過使用 霧著色器 自訂。
使用四邊形偽造體積霧
在某些情況下,最好使用專門配置的 QuadMeshes 作為體積霧的替代方案:
四邊形(Quad)可搭配任何渲染方式使用,包括 Mobile 及 Compatibility 模式。
四邊形不需要時間重投影即可看起來平滑,這使得它們適合快速移動的動態效果,例如雷射。它們還可以表示體積霧無法有效實作的小細節。
四邊形通常比體積霧具有更低的性能成本。
雖然有一些不同的地方:
霧效果的衰減不太真實,尤其是當相機進入霧中時。
當精靈重疊時,可能會出現透明度排序問題。
如果相機附近有很多精靈,效能不一定會比體積霧更好。
要建立基於 QuadMesh 的霧精靈:
建立一個 MeshInstance 節點,將其 Mesh 屬性設為 PlaneMesh 或 QuadMesh。將該網格的大小調整到與影片的長寬比一致(否則看上去就會變形)。
在 GeometryInstance 部分的 Material Override 屬性中新建一個 SpatialMaterial 資源。
在StandardMaterial3D中,將**Shading > Shading Mode**設定為**Unshaded**,Billboard > Mode**設定為**Enabled,啟用**Proximity Fade**並將**Distance Fade* 設定為* 像素阿爾法。
將 反照率 > 紋理 設定為下面的紋理(右鍵單擊並選擇 另存為...):
設定反照率貼圖 後 ,前往匯入面板,選取該貼圖並將其壓縮模式變更為 無損,以改善品質。
霧的顏色使用 Albedo > Color 屬性設定;它的密度是使用顏色的 Alpha 通道設定的。為了獲得最佳結果,您必須根據 QuadMesh 的大小調整 Proximity Fade > Distance 和 Distance Fade > Max Distance。
或者,如果您將四邊形放置在其所有角落都處於實體幾何形狀中的方式,則可以停用廣告看板。這對於相機無法進入的大型平面(例如無底坑)的霧化非常有用。