Unity 2022 LTS與2023.1中的新水系統(tǒng)(Water System)

精美的游戲環(huán)境或多或少都需要一片海洋、湖泊、河流甚至泳池。這些水效果有許多用著色器進行模擬的方法,但在高清渲染管線(HDRP)里構(gòu)筑一個完全基于物理的一體化水系統(tǒng)向來是一項復雜且耗時的任務。
這里,我們隆重介紹 Unity Water System,這款解決方案首次在Unity 2022.2 Tech Stream的HDRP,作為渲染方面的一項重點被推出。之后的2023.1 Tech Stream進一步擴展了水系統(tǒng)功能集,使其能更好地與世界和游戲過程整合。
輕松創(chuàng)建海洋、湖泊、河流或泳池
環(huán)境美術(shù)們現(xiàn)在可以輕松創(chuàng)建和配置各類水面,如海洋、湖泊、河流和泳池。水面可以與其他世界及游戲元素(如船只或海濱)相結(jié)合。
制作的第一步是為項目啟用水效果:
為每一級質(zhì)量(每一級渲染管線配置文件)啟用和配置水效果;
在攝像機的幀設定(Frame Settings)里啟用水效果;
在場景內(nèi)用Water Rendering體積覆蓋啟用水效果,可以根據(jù)相機的位置在需要時啟用水渲染。
啟用水效果后,你只需在GameObject菜單里點擊幾下就能創(chuàng)建漂亮的水體了。HDRP提供了三種水面類型:泳池、河流和海洋。

用水樣例項目快速上手

水體的創(chuàng)建可以非常快,Water System帶有許多工具和選項,可用于自定義效果,或把水體結(jié)合到世界和游戲過程里。
要想快速了解所有系統(tǒng)和擴展功能的實際使用,請查看HDRP軟件包內(nèi)的水樣例(打開Package Manager >? 選中In Project列表里的High Definition Render Pipeline包 >? 在Samples一欄中選擇Water Samples)。
我們提供了四個樣例場景:
泳池(Pool)場景展示了如何在同一場景里設置不同高度的“泳池”,以及如何用自定義網(wǎng)格渲染帶自定義形狀的水面;
島嶼(Island)場景展示了海洋水體,包含了一個可以消除島嶼四周涌浪的水遮罩,可以形成波浪的水變形器,可為海灘加上泡沫的貼花,可在波浪后方及島與周圍生成泡沫的泡沫生成器,以及可在船體內(nèi)去除水的水排除器。它還側(cè)重于用Burst和水查詢API來并行計算多個對象(如多只海鷗)的水面漂浮效果。
冰川(Glacier)場景展示了許多功能,包括:
河流水體
用于創(chuàng)建瀑布的水變形器
水流流過冰川的流體模擬
使冰山隨河流漂流的水查詢API
在冰山后方加上泡沫的泡沫生成器
用Shader Graph和Water主節(jié)點為河流邊緣和瀑布漩渦添加自定義泡沫
形成水流落入瀑布動畫的貼花
投射到水面外部的樣例焦散效果
水際線(Waterline)場景展示了用自定義通道定制水面水平與水下渲染,產(chǎn)生更大的模糊分離效果,模擬水對攝像機鏡頭的影響。
了解大致情況后,我們再深入探索每個子系統(tǒng)。
基于物理的水體渲染
Water System提供了現(xiàn)成的、基于物理的水著色器,它根據(jù)HDRP最新推出的光照模型設計,還可用Shader Graph進行定制。你能調(diào)整水面的平緩度、折射、吸收、漫射和光散射等屬性。
散射顏色的作用類似于水的基礎色,所以可以從這里開始設置水的整體觀感。然后,你能修改吸收距離和折射顏色,控制水的透明度以及物體經(jīng)水折射出的顏色。如果是清澈的加勒比海,吸收距離可以更大,散射與折射顏色可以是青色;如果是污濁的河流,你可能要用深褐色的散射顏色及更小的吸收距離來形成一條幾乎不透明的河流。
2022.2版本的水體渲染存在著一些限制,部分在2023.1版本已經(jīng)得到解決(比如穿過體積云看到后方的水體、更精確的水際線),部分則會在2023.2版本解決(更好的性能、支持渲染與水體重疊的透明表面)。
潛入水面
如果你和我們一樣是雅克-伊夫·庫斯托(Commandant Cousteau,Jacques-Yves Cousteau 的尊稱)的粉絲,你肯定會愛上Water System的水底效果的。系統(tǒng)可以檢測攝像機是否處于水面下方,并根據(jù)水的物理性質(zhì)模擬水下畫面。
程序化生成的焦散效果可以模擬光線從投射在地面上的水表面上折射的效果。注意,焦散效果能作為水面外部的投影使用,比如當作貼花來模擬水體焦散在洞穴內(nèi)部的反射。
當攝像機處于水中與水上之間時,鏡頭內(nèi)就會產(chǎn)生水際線,攝像機浸入水中的部分會有水下渲染效果。2023.1更是改進了水際線渲染,允許你用自定義通道進行定制(請參考:The Water Line樣例場景)。
涌浪、攪動、漣漪和水流
水的運動能讓水更加吸引人。請注意,我們的水模擬系統(tǒng)更側(cè)重于水平面的變形,而不是流體或濺潑模擬。
模擬參數(shù)設置
波浪是用快速傅里葉變換(FFT)模擬程序化生成而來。簡單來說,它的原理是把多種不同頻率的簡單波浪疊加起來,形成復雜的波浪效果。通過控制頻率范圍,你可以控制水的擾動程度。
該系統(tǒng)通過將不同頻率范圍的波動相加來進行模擬,我們將這些頻率范圍稱為"波段"。
HDRP支持最多三個波段,模擬了真實世界對水的三種影響,可滿足大多數(shù)用例:
涌浪,代表了月亮與遠處風產(chǎn)生的波浪效果。它僅由遠處風的參數(shù)控制,可以指定浪的方向;
擾動,代表風所產(chǎn)生的混亂運動;
漣漪,代表水流或小范圍風的效果。這是頻率最高或波浪最小的波段,可為水面增添精細的細節(jié)。

比如,泳池的擾動很小,只會有頻率最高的漣漪波段;更復雜的河流會有漣漪和擾動波段;而海洋則擁有全部三種頻率范圍,覆蓋現(xiàn)實中看到的各類大小波浪。模擬以一塊立方體積為基本單位,向四周無限重復。
在2023.1里,我們會為水流增加支持,讓漣漪隨著流動貼圖流動。該模擬具備絕對的確定性,在多人游戲、物理模擬或錄制短片或電影時都能產(chǎn)生一致的結(jié)果。
大規(guī)模精確渲染
為了渲染水平面的形變,系統(tǒng)采用了頂點偏移(vertex displacement),偏移結(jié)果可應用在程序生成的幾何形或你自己的網(wǎng)格上。這些幾何形的程序化生成方法是在相鄰位置實例化四邊形,類似于地形的渲染。同樣的方法也能用在無限的海洋或超長的河流上,來保證頂點的密度可隨攝像機位置而改變。
此外,為了在渲染小漣漪時擁有更細的頂點密度,HDRP可以依靠GPU細分(Tessellation),借助特殊著色器進一步劃分三角形。有了該功能后,每當攝像機進入一定距離范圍,你都能在視線近處看到更多的三角形生成。
系統(tǒng)還提供了多種平衡圖像質(zhì)量與渲染性能的選項。更多關(guān)于性能優(yōu)化的內(nèi)容請在文檔中了解:
https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@16.0/manual/WaterSystem-QualityPerformance.html
模擬采樣
正如剛剛解釋的,為了提高效率,模擬會由GPU全權(quán)負責,但部分模擬可以復制到CPU上,以便對水的高度和水流進行采樣(做出物體順著河流漂浮等效果)。
這會產(chǎn)生不少CPU開銷,因為模擬需要執(zhí)行大量計算,但這一開銷能借助使用Burst編譯器編譯的jobs來進行高效的并行運算,從而維持在一個合理的范圍內(nèi)。
注意,根據(jù)用戶反饋,2022.2與2023.1間的編程API已經(jīng)有了變化,你的代碼可能需要進行調(diào)整。
要進行采樣,你可以找到場景內(nèi)的兩份代碼樣例:Island場景的代碼可利用Burst來并行采樣多個物體,Glacier場景的代碼更簡單,沒有并行代碼,它展示了讓冰塊沿著河流漂浮并落入瀑布。
泡沫
泡沫模擬的水面及水下氣泡,或由風吹向浪尖產(chǎn)生,或由浪拍在海岸及巖石上產(chǎn)生,或由船只及人物的水中運動產(chǎn)生。
Water System可以根據(jù)水體模擬與遠處風的風速自動給河流與海洋生成泡沫。它還允許調(diào)整泡沫的數(shù)量和外觀,選擇其平滑度和紋理的平鋪方式。

2023.1新增了泡沫生成器(Foam Generator),用于模擬船舶航行、波浪或開闊水域的巖石周圍的白色水沫,讓泡沫能在生成后隨著波浪自行流動。在樣例場景里,你會看到泡沫生成器的兩種用法:Island場景用它生成浪尖和島嶼周圍的泡沫;Glacier場景用它生成河上漂流的冰山后方的泡沫。

利用Shader Graph,你可以把自定義泡沫接到Water主節(jié)點,給河水邊或瀑布漩渦加上自定義的程序生成泡沫。在Glacier樣例里,瀑布底的漩渦就是用Shader Graph滾動并混合自定義泡沫紋理來實現(xiàn)的。邊界上的泡沫則是通過采樣Depth Buffer、求得大致深度來制作的。

模擬的泡沫將被注入到波浪攪動需要的地方。但出于美學考慮,你可能需要用泡沫遮罩(foam mask)屏蔽掉某些區(qū)域,使其免受泡沫影響。
與世界相結(jié)合
為了讓環(huán)境看著更逼真,水面和模擬通常需要局部修改才能更好地與世界及道具結(jié)合。比如刪去船內(nèi)的水體幾何形,在海岸存在涌浪的一側(cè)加上拍浪,給巖石四周生成泡沫,修改局部水流,營造海灣內(nèi)的平靜水域,在河流中段創(chuàng)建瀑布,或生成河流內(nèi)的小漩渦及海洋中的巨型漩渦。
你可以用多個組件來自定義模擬、泡沫和水流,創(chuàng)造出小范圍的水體變化或更復雜的效果:
水遮罩(Water Mask)允許在特定部分的水面上減弱或抑制漣漪、涌浪和泡沫。
貼花(Decal)可以用于制作水面上的小范圍泡沫、覆蓋水的平滑度,或借助法線貼圖模擬小范圍變形,如水滴、沖擊或自定義漣漪。它們也能獨立于水系統(tǒng)模擬出沙灘或巖石上的濕潤感(見Island樣例場景)或墻壁上的焦散效果(見Glacier樣例場景)。注意,貼花會被用作灰度圖,因此顏色不能修改。
水變形器(Water Deformer)可以修改一小塊位置的模擬,來產(chǎn)生Island樣例里的波浪或Glacier樣例里的瀑布。
性能與調(diào)試
我們在多主機上開啟了大部分功能,測試了Glacier場景的性能,并分析了Water System。經(jīng)過測量,我們發(fā)現(xiàn)水的渲染時間在最新一代主機上的GPU耗時約為4毫秒,而上一代主機需要大約7毫秒。當然,這個耗時很大程度上取決于水的質(zhì)量設置、模擬的復雜性及屏幕上的像素數(shù)量。但該系統(tǒng)的性能足以在各類平臺上流暢運行。
此外,該系統(tǒng)使用了延遲集群光照(deferred clustered lighting)來優(yōu)化著色,并支持大量光源。由于遠近波浪都需要獲取關(guān)鍵的頂點數(shù)量,大部分渲染時間其實都花在了GBuffer通道上。如果在表面上啟用GPU細分,我們可以通過修改最大細分等級和攝像機遠處淡出距離來控制這個開銷。
在每個水面的Miscellaneous(雜項)部分,你可以用各種調(diào)試模式來可視化水流方向、變形、泡沫以及其他水面上的遮罩。

水體 Demo
為了呈現(xiàn)Water System在更復雜場景里的運行,我們創(chuàng)建了一個展示泳池、島嶼和河流的演示項目。

Island場景包含了一片無邊際的海洋,海灘上會形成岸邊的波浪。它展示了怎樣使用水遮罩、用自定義渲染紋理創(chuàng)建變形器和泡沫生成器。當海浪靠近海灘時,它還會用貼花來形成復雜的水面交互。

Pool場景展示了一個室內(nèi)水面,具有逼真的顏色、深度、水底和焦散效果。

River場景展示了實例化四邊形的使用,用水流貼圖模擬水流,以及貼花、自定義Shader Graph、增強視覺效果的VFX Graph。
可以在GitHub上下載這些demo:
https://github.com/Unity-Technologies/WaterScenes
如何開始
要使用水系統(tǒng),你必須使用HDRP和Unity 2022.2及以上版本。2022.2只包括了一些初級功能,我們推薦從2023.1開始,新版本增添了多項功能和改進,部分API也經(jīng)過了修改。
如上文所述,可以在Package Manager里下載水樣例場景,把代碼和系統(tǒng)用到自己的項目中。此外,也能在GitHub上看看我們的WaterScenes demo,了解更復雜的水系統(tǒng)整合實例。
更多信息,請觀看Rémi和Adrien在GDC 2023上做的Water System深入講解:

或前往文檔了解:
https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@16.0/manual/WaterSystem.html