與 大氣散射[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 紋理)。
- 對(duì)于每一個(gè)小方塊,我們?cè)?Compute Shader 里計(jì)算:
- 光線累積 (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。
