3d游戲開(kāi)發(fā)特性名詞_Volumetric Fog Atmospheric Fog

與 大氣散射[http://www.itdecent.cn/p/dc8f2cd8a7f2] 相關(guān)

1. 相同的靈魂:物理公式

無(wú)論是大氣散射(Atmospheric Scattering)還是體積霧(Volumetric Fog),它們底層都在算同一個(gè)積分公式:
也就是:

  • 光線射入介質(zhì)(空氣/霧)。
  • 光線被介質(zhì)吸收(變暗)。
  • 光線被介質(zhì)散射(發(fā)亮,形成光路)。
2. 不同的軀殼:工程實(shí)現(xiàn)的巨大差異

雖然公式一樣,但應(yīng)用場(chǎng)景的約束完全不同,導(dǎo)致了渲染管線走了兩條路。
A. 大氣散射 (Atmospheric Scattering)

  • 場(chǎng)景: 它是背景。距離無(wú)限遠(yuǎn)(從地面到太空)。
  • 光影: 它可以忽略遮擋(通常不計(jì)算云層或山體對(duì)大氣的實(shí)時(shí)陰影,因?yàn)樘h(yuǎn)了)。
  • 優(yōu)化手段:LUT (查找紋理)。
    • 因?yàn)檫@東西變化很慢(整個(gè)天空是漸變的),且它是“宏觀”的,所以我們預(yù)計(jì)算成一張圖,直接貼在無(wú)窮遠(yuǎn)的天球上。
    • 關(guān)鍵點(diǎn): 它只處理“光和空氣”,不處理“光和物體”。
      B. 體積霧 (Volumetric Fog)
  • 場(chǎng)景: 它是前景。距離很近(就在你相機(jī)前 0~100 米)。
  • 光影: 它必須計(jì)算遮擋。這是核心區(qū)別!
    • God Rays (體積光) 的本質(zhì): 當(dāng)光線穿過(guò)霧氣時(shí),如果中間有一棵樹(shù)擋住了光,霧氣里必須出現(xiàn)一條黑色的“影子通道”。這就是 God Rays。
    • 大氣散射通常不管這棵樹(shù),但體積霧必須管。
  • 優(yōu)化手段:Frustum Voxel Grid (視錐體體素網(wǎng)格)。
    • LUT 沒(méi)法用了,因?yàn)閳?chǎng)景里的物體和燈光每幀都在變。
    • Raymarching(對(duì)每個(gè)像素暴力光線步進(jìn))太卡了。
    • 于是,工業(yè)界發(fā)明了“體素化”方案(見(jiàn)下文)。
3. Unity 中體積霧的底層:Frustum Voxel Grid

這是現(xiàn)代 3A 游戲(包括 Unity HDRP 和 Unreal Engine)實(shí)現(xiàn)體積霧和 God Rays 的標(biāo)準(zhǔn)技術(shù)。
它的原理非常巧妙:

  • 切蛋糕 (Voxelization):
    • 想象你的相機(jī)視錐體(Camera Frustum)是一個(gè)梯形的蛋糕。
    • 我們?cè)诘头直媛氏拢ū热?160x90x64),把這個(gè)空間切成無(wú)數(shù)個(gè)小方塊(Voxels/Froxis)。注意,這里的 Z 軸是沿著相機(jī)深度的。
  • 計(jì)算光照 (Compute Shader):
    • 對(duì)于每一個(gè)小方塊,我們?cè)?Compute Shader 里計(jì)算:
      • 這個(gè)方塊里有霧嗎?(Density)
      • 這個(gè)方塊被光照到了嗎?(采樣 Shadow Map) —— 這就是 God Rays 產(chǎn)生的地方! 如果 Shadow Map 說(shuō)這個(gè)點(diǎn)是黑的,那這個(gè)方塊就不亮。
    • 結(jié)果存入一張 3D Texture (3D 紋理)。
  • 光線累積 (Raymarching the 3D Texture):
    • 沿著視線方向,把這些小方塊的亮度和透明度累加起來(lái)(積分),生成一張最終的體積光紋理。
  • 混合 (Upsampling):
    • 把這張低分辨率的體積光紋理,拉伸放大,覆蓋到屏幕上,和場(chǎng)景物體混合。
4. 你的困惑:FogVolume 和 VolumetricLight 是什么?

在 Unity (特別是 HDRP) 中,這些組件就是為了控制上面提到的那個(gè) Voxel Grid。

  • Volumetric Fog (Global):
    • 設(shè)置整個(gè)場(chǎng)景的基礎(chǔ)霧濃度。它填充了所有的 Voxels。
  • Fog Volume (Local):
    • 這是一個(gè)局部覆蓋。比如你走進(jìn)一個(gè)沼澤,這里有一個(gè) Box Collider。
    • Unity 會(huì)判斷:如果某個(gè) Voxel 在這個(gè) Box 范圍內(nèi),就人為增加這個(gè) Voxel 的密度數(shù)據(jù)。
    • 這就像是在那張 3D 紋理里“畫”了一團(tuán)墨水。
  • Volumetric Light (Light Component):
    • 這是告訴渲染器:計(jì)算 Voxel 光照時(shí),請(qǐng)把這盞燈也算進(jìn)去。
    • 開(kāi)啟 Volumetric Shadows:計(jì)算 Voxel 時(shí)強(qiáng)制采樣 Shadow Map。有了這個(gè),光線被物體遮擋后,霧氣里才會(huì)出現(xiàn)“光柱” (God Rays)。
5. 總結(jié):如果我在 Unity 里都要用,會(huì)有沖突嗎?

不會(huì),它們通常是分層疊加的:

  • 最遠(yuǎn)處: Atmospheric Scattering (天空盒) 負(fù)責(zé)渲染藍(lán)天、夕陽(yáng)背景。這是底色。
  • 近處: Volumetric Fog (體積霧) 負(fù)責(zé)渲染你身邊的空氣感、路燈的光暈、樹(shù)林里的耶酥光。這是疊加層。

所以,你現(xiàn)在的理解完全打通了:大氣散射是大自然的宏觀背景,體積霧是場(chǎng)景里的微觀光影,兩者物理同源,但工程分家。


unity URP

這是一個(gè)非常關(guān)鍵的問(wèn)題,因?yàn)?Unity 在 URP (Universal Render Pipeline) 和 HDRP 的策略上長(zhǎng)期存在巨大差異。
答案取決于你使用的 Unity 版本:
情況 A:Unity 6 (2023.3+) —— 終于有了!
在最新的 Unity 6 Preview (以及 URP 17+) 中,Unity 終于給 URP 加入了原生的 Volumetric Fog (體積霧)。

  • 它的原理:
    它確實(shí)使用了類似 HDRP 的技術(shù)(基于 3D 紋理/Voxel 的 Raymarching),但為了適配中低端設(shè)備(手機(jī)、Switch),它做了一些簡(jiǎn)化和優(yōu)化。
  • 怎么開(kāi)啟:
    • 在 URP Asset 設(shè)置里,找到 Quality -> Volumetric Fog 并勾選。
    • 在場(chǎng)景里的 Global Volume 組件中,添加 Override -> Fog。
    • 把 Fog Mode 改為 Volumetric。
  • 能實(shí)現(xiàn) God Rays 嗎?
    能。它會(huì)結(jié)合 Shadow Map 計(jì)算光柱。
    情況 B:Unity 2022 LTS 及更早版本 —— 默認(rèn)沒(méi)有
    如果你還在用目前主流的 Unity 2020, 2021, 或 2022 LTS,答案是 No。
    默認(rèn)的 URP 只有 基礎(chǔ)霧 (Basic Fog)。
  • 它是什么: 僅僅是根據(jù)像素的深度(Depth),把遠(yuǎn)處物體的顏色混合成灰色。
  • 它不是什么: 它完全不懂光照。光線穿過(guò)它不會(huì)變亮,物體遮擋光線也不會(huì)產(chǎn)生“上帝之光” (God Rays)。它只是一個(gè)全屏濾鏡。
    那在老版本 URP 里怎么實(shí)現(xiàn) God Rays?
    既然官方?jīng)]給,在 URP 中實(shí)現(xiàn)體積光通常有兩條路:
1. 方案一:屏幕空間散射 (Screen Space God Rays) — 性能最好,效果一般(TODO,不懂)

這是一種“假”體積光,也是手游最常用的方案。

  • 原理:
    • 渲染一張只有太陽(yáng)和高亮物體的圖(把遮擋物扣黑)。
    • 對(duì)這張圖進(jìn)行徑向模糊 (Radial Blur)。
    • 把模糊后的結(jié)果疊加回屏幕。
  • 優(yōu)點(diǎn): 極快,手機(jī)隨便跑。
  • 缺點(diǎn): 只有當(dāng)你看著太陽(yáng)時(shí)才有光柱。如果你轉(zhuǎn)頭,光柱就消失了(因?yàn)樗淮嬖谟谄聊豢臻g)。
  • 實(shí)現(xiàn): 以前需要自己寫 ScriptableRendererFeature,現(xiàn)在 Asset Store 有很多免費(fèi)的(如 Occulusion Shafts)。


    image.png
2. 方案二:基于 Mesh 的假光柱 — 這種最古老
  • 原理: 美術(shù)做一個(gè)圓錐體的模型,貼一個(gè)半透明的材質(zhì),插在窗戶或路燈下。
  • 優(yōu)點(diǎn): 極度省性能,完全可控。
  • 缺點(diǎn): 穿幫嚴(yán)重,人走進(jìn)去不會(huì)有真實(shí)的體積感,只是個(gè)透明片。
3. 方案三:使用插件 (Asset Store) — 最推薦

由于 URP 官方長(zhǎng)期缺席,Asset Store 里的插件已經(jīng)進(jìn)化得非常完美。它們通過(guò)自定義 Render Feature 實(shí)現(xiàn)了真正的 Frustum Voxel Grid 體積霧。
最著名的兩款(幾乎是 URP 項(xiàng)目標(biāo)配):

  • Volumetric Fog & Mist 2 (Cronos): 性能優(yōu)化極好,支持手機(jī),效果接近 HDRP。
  • Aura 2 / Aura 3: 效果極度炸裂,但比較吃性能,適合 PC/主機(jī)版 URP 游戲。
    總結(jié):URP 到底用不用那個(gè)“Voxel Grid”技術(shù)?
  • Unity 2022 及以前: 默認(rèn)不用。默認(rèn)只有深度霧。
  • Unity 6+: 默認(rèn)用了(簡(jiǎn)化版)。
  • 插件(如 Volumetric Fog 2): 用了。它們手動(dòng)實(shí)現(xiàn)了那套技術(shù)。

Atmospheric Fog 大氣霧

與Volumetric Fog 不是一回事,但在視覺(jué)目標(biāo)上有重疊。
你可以把 Atmospheric Fog (大氣霧) 看作是“平面的、基于距離的著色欺騙”,而把 Volumetric Fog (體積霧) 看作是“真實(shí)的、具有物理特性的空間介質(zhì)”。

1. Atmospheric Fog vs. Volumetric Fog
特性 Atmospheric Fog (大氣霧/常規(guī)模擬) Volumetric Fog (體積霧)
實(shí)現(xiàn)原理 基于深度緩沖區(qū)(Z-Buffer)。根據(jù)物體離相機(jī)的距離,直接在顏色上插值。 基于體素(Voxel)或參與介質(zhì)。模擬光線在空氣中被粒子散射的過(guò)程。
空間感 均勻的。無(wú)論你怎么動(dòng),霧的密度只隨距離變化。 3D空間的。你可以看到霧團(tuán)、光柱(丁達(dá)爾效應(yīng))。
光照交互 很難受光照影響,通常只是簡(jiǎn)單的顏色疊加。 與光影完美融合。陰影會(huì)遮擋光路產(chǎn)生“光軸”。
性能開(kāi)銷 極低(幾乎免費(fèi))。 較高(涉及 3D 紋理和射線步進(jìn) Raymarching)。
2. Unity URP 中有內(nèi)置嗎?

關(guān)于 Atmospheric Fog,情況比較微妙:

  • 基礎(chǔ)距離霧 (Distance Fog): 有內(nèi)置。
    在 URP 的 Lighting 窗口 -> Environment 選項(xiàng)卡下,你可以開(kāi)啟 Fog。它支持 Linear、Exponential 和 Exponential Squared 三種模式。這是最基礎(chǔ)的大氣模擬。
  • 物理大氣散射 (Atmospheric Scattering): 部分內(nèi)置。
    在 URP 的 Volume 系統(tǒng)中,有一個(gè) Physically Based Sky。它能模擬天空因大氣散射產(chǎn)生的顏色變化,但它更多是針對(duì)“天空盒”,而不是針對(duì)場(chǎng)景深度中的“霧氣”。
  • 體積霧 (Volumetric Fog): 官方?jīng)]有原生內(nèi)置。
    這是 URP 經(jīng)常被開(kāi)發(fā)者吐槽的一點(diǎn)。相比之下,Unity 的 HDRP 是原生內(nèi)置高質(zhì)量體積霧的。
3. 如果沒(méi)有,該如何實(shí)現(xiàn)?

如果你在 URP 中需要實(shí)現(xiàn)更高級(jí)的大氣霧或體積霧,通常有以下幾種方案:

A. 開(kāi)啟內(nèi)置基礎(chǔ)霧(最簡(jiǎn)單)
  • 打開(kāi) Window > Rendering > Lighting。
  • 在 Environment 標(biāo)簽頁(yè)勾選 Fog。
  • 確保你的 Shader 包含 multi_compile_fog 變體(URP 官方 Shader 均已支持)。
B. 使用 Shader Graph 自定義(大氣霧進(jìn)階)

如果你想要那種“高度霧”(低處濃、高處?。憧梢杂?Shader Graph 編寫一個(gè)全局后處理效果:

  • 利用 Position 節(jié)點(diǎn)的 World Space Y 軸分量。
  • 公式參考:FogDensity = e^{-Height \cdot Density}。
  • 通過(guò) Renderer Feature 將其注入到渲染管線中。
C. 使用第三方插件(實(shí)現(xiàn)體積霧的最佳途徑)

由于從零開(kāi)發(fā)高性能的體積霧(基于 GPU 3D LUT 或 Froxel)門檻較高,社區(qū)通常推薦成熟的插件:

  • Buto: 專門為 URP 設(shè)計(jì),視覺(jué)效果極佳。
  • Aura 2: 經(jīng)典的體積光/霧解決方案。
  • Enviro / Weather Maker: 這種全天候系統(tǒng)插件自帶了高質(zhì)量的大氣和體積霧功能。
D. 手動(dòng)實(shí)現(xiàn)簡(jiǎn)單的體積光(Fake 方案)

如果你只需要一束光照下來(lái)的感覺(jué),可以使用 Radial Blur (徑向模糊) 后處理,或者使用簡(jiǎn)單的 Mesh Beam (面片光柱) 配上軟粒子 Shader。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容