戰(zhàn):用 volsample 在 Unity 中實(shí)現(xiàn)零走樣的實(shí)時(shí)體積云渲染)
云海與霧效實(shí)戰(zhàn)用 volsample 在 Unity 中實(shí)現(xiàn)零走樣的實(shí)時(shí)體積云渲染【免費(fèi)下載鏈接】volsampleStructured Volume Sampling - sample placement algorithm for real-time volume rendering with low aliasing, for camera-in-volume case.項(xiàng)目地址: https://gitcode.com/gh_mirrors/vo/volsample體積云渲染是游戲與可視化項(xiàng)目中極具視覺沖擊力的實(shí)時(shí)渲染技術(shù)但相機(jī)進(jìn)入云層內(nèi)部時(shí)傳統(tǒng)的固定 Z 平面采樣會(huì)讓采樣點(diǎn)隨相機(jī)移動(dòng)而掃過體積產(chǎn)生嚴(yán)重的閃爍與走樣。volsample正是為解決這一痛點(diǎn)而生的開源項(xiàng)目——它基于 SIGGRAPH 2015 課程論文《A Novel Sampling Algorithm for Fast and Stable Real-Time Volume Rendering》提供一套名為Structured Volume Sampling結(jié)構(gòu)化體積采樣的新算法讓相機(jī)在體積內(nèi)部飛行時(shí)依然保持穩(wěn)定、零走樣的實(shí)時(shí)體積云渲染效果。本文將從零開始帶你快速跑通這個(gè) Unity 項(xiàng)目并理解其背后的采樣原理。什么是 Structured Volume Sampling實(shí)時(shí)體積云渲染的走樣難題傳統(tǒng)實(shí)時(shí)體積云渲染通常采用固定 Z 平面采樣Fixed-Z Sampling即把采樣點(diǎn)放在與視線垂直的平面上。這種方式實(shí)現(xiàn)簡(jiǎn)單但當(dāng)相機(jī)平移時(shí)采樣點(diǎn)會(huì)隨相機(jī)一起移動(dòng)、在體積中掃過每一幀采樣位置不同畫面就會(huì)出現(xiàn)明顯的抖動(dòng)和閃爍即便用釘住采樣Pinned Sampling補(bǔ)償前向運(yùn)動(dòng)相機(jī)旋轉(zhuǎn)時(shí)依然會(huì)失效。volsample 的思路完全不同把采樣點(diǎn)固定在世界空間的一組平行平面上讓相機(jī)運(yùn)動(dòng)時(shí)采樣點(diǎn)只是平行于平面滑動(dòng)而不會(huì)穿越體積內(nèi)部。這樣無論相機(jī)如何平移旋轉(zhuǎn)畫面都穩(wěn)定如初從根源上消除了實(shí)時(shí)體積渲染的走樣問題。上圖展示了這套算法的核心相機(jī)周圍被一個(gè)倒角正十二面體Beveled Dodecahedron包圍體積采樣點(diǎn)就放置在與五邊形面平行的世界空間平面上綠色區(qū)域當(dāng)多個(gè)平面相交時(shí)則需要混合多條射線黃色為 2 條、紅色為 3 條??焖偕鲜种改先绾芜\(yùn)行 volsample 的 Unity 體積渲染示例項(xiàng)目是一個(gè)標(biāo)準(zhǔn)的 Unity 5 工程README 中標(biāo)注最后在 5.6 上運(yùn)行幾乎零配置即可運(yùn)行。整個(gè)算法與場(chǎng)景都集中在 VolumeRender.shader 中通過 shader feature 自由切換不同的采樣方案和演示場(chǎng)景。一鍵打開示例場(chǎng)景在 Unity 中打開項(xiàng)目后進(jìn)入 Scenes 文件夾直接雙擊加載即可clouds.unity云海場(chǎng)景即文章標(biāo)題對(duì)應(yīng)的體積云渲染效果sponza.unitySponza 室內(nèi)場(chǎng)景中的體積霧 聚光燈效果fogcube.unity基礎(chǔ)的立方體霧效演示Experimental 目錄DDA 采樣、等值線等進(jìn)階實(shí)驗(yàn)場(chǎng)景運(yùn)行后畫面左上角會(huì)出現(xiàn)一個(gè)簡(jiǎn)單的 GUI 開關(guān)可以實(shí)時(shí)切換Structured Sampling與Pin Samples兩種采樣模式——這是親眼對(duì)比走樣效果的最佳方式開啟結(jié)構(gòu)化采樣時(shí)畫面穩(wěn)定關(guān)閉后立刻出現(xiàn)閃爍。實(shí)時(shí)對(duì)比采樣效果腳本 StructuredVolumeSampling.cs 負(fù)責(zé)驅(qū)動(dòng)整個(gè)渲染管線核心邏輯在OnRenderImage中完成三趟繪制先畫十二面體的五邊形面1 次光線步進(jìn)再畫倒角矩形邊2 次步進(jìn)混合最后畫倒角三角形角點(diǎn)3 次步進(jìn)混合。你可以直接運(yùn)行項(xiàng)目快速體驗(yàn)零走樣與傳統(tǒng)采樣的差異無需修改任何代碼。深入原理十二面體如何實(shí)現(xiàn)零走樣的體積采樣三步理解結(jié)構(gòu)化采樣算法固定世界空間平面在相機(jī)周圍構(gòu)建倒角正十二面體采樣點(diǎn)位于與五邊形面平行的世界空間平面上平面間距恒定SAMPLE_PERIOD。按入射角調(diào)整步長(zhǎng)射線與平面不垂直時(shí)步長(zhǎng)按SAMPLE_PERIOD / |dot(rd, n)|放大保證相鄰采樣在體積內(nèi)等距分布這一步在 RayMarchCore.cginc 的IntersectPlanes函數(shù)中實(shí)現(xiàn)。多射線加權(quán)混合平面相交區(qū)域用 2~3 條射線分別步進(jìn)并加權(quán)融合避免了面與面交界處的接縫瑕疵。倒角幾何的作用PlatonicSolidBlend.cs 在編輯器中實(shí)時(shí)生成帶倒角的十二面體網(wǎng)格并把 3 組平面法線編碼進(jìn) UV 通道、把混合權(quán)重寫進(jìn)頂點(diǎn)色。倒角的存在讓相鄰五邊形面之間形成平滑過渡的矩形和三角形區(qū)域配合權(quán)重混合徹底消除了可能出現(xiàn)的不自然接縫。云海場(chǎng)景與霧效場(chǎng)景的采樣參數(shù)云海場(chǎng)景SceneClouds.cgincSAMPLE_COUNT 32SAMPLE_PERIOD 1.0融合了 iq 與 nimitz 的經(jīng)典 Shadertoy 云朵實(shí)現(xiàn)聚光燈霧效SceneFogSpotlight.cgincSAMPLE_COUNT 32SAMPLE_PERIOD 0.6配合 SpotLight.cginc 實(shí)現(xiàn)光源體積效果進(jìn)階玩法調(diào)整采樣參數(shù)與調(diào)試技巧參數(shù)調(diào)優(yōu)速查表參數(shù)位置作用建議SAMPLE_COUNT場(chǎng)景 cginc采樣總數(shù)越大越細(xì)膩越吃性能SAMPLE_PERIOD場(chǎng)景 cginc采樣間距越小越清晰bevelPlatonicSolidBlend倒角大小拖動(dòng)可觀察混合區(qū)域變化DEBUG_BEVELVolumeRender.shader可視化三種混合區(qū)域設(shè) 1 后可用不同顏色區(qū)分想看清隱藏的十二面體在 VolumeRender.shader 中把DEBUG_BEVEL宏改為 1再用 GPU 抓幀工具查看就能看到包圍相機(jī)的十二面體幾何。配合DEBUG_WEIGHTS宏還可以可視化各條射線的混合權(quán)重分布。額外資源Shadertoy 在線演示與文檔體積渲染在線演示位于 src/shadertoy/clouds.shader采樣原理圖解見 src/shadertoy/diagram_Image.shader瀏覽器中即可交互體驗(yàn)最新算法的原理草稿幻燈片在 doc/volsample.pptx項(xiàng)目渲染效果視頻img/volrender_800x450_30fps.mp4結(jié)語一套值得收藏的體積云渲染采樣方案volsample 用把采樣固定在世界空間平面上這一個(gè)看似簡(jiǎn)單的思路優(yōu)雅地解決了相機(jī)在體積內(nèi)部時(shí)實(shí)時(shí)體積云渲染的走樣頑疾而且實(shí)現(xiàn)精簡(jiǎn)、MIT 開源、開箱即用。無論你是想做云海漫游、霧效探索還是煙霧特效這套結(jié)構(gòu)化體積采樣方案都值得你 clone 下來親自體驗(yàn)?zāi)呐轮皇谴蜷_ clouds 場(chǎng)景轉(zhuǎn)一轉(zhuǎn)相機(jī)也能立刻感受到零走樣帶來的絲滑穩(wěn)定?!久赓M(fèi)下載鏈接】volsampleStructured Volume Sampling - sample placement algorithm for real-time volume rendering with low aliasing, for camera-in-volume case.項(xiàng)目地址: https://gitcode.com/gh_mirrors/vo/volsample創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考