【轉(zhuǎn)】四種體積光的寫法:RayMarching、徑向模糊、Noise造假術(shù)、擠出造假術(shù)(包含URP
四種體積光的寫法:RayMarching、徑向模糊、Noise造假術(shù)、擠出造假術(shù)(包含URP、Build-In、ASE不同實(shí)現(xiàn),并附帶源碼)
四種體積光的寫法:RayMarching、徑向模糊、Noise造假術(shù)、擠出造假術(shù)(包含URP、Build-In、ASE不同實(shí)現(xiàn),并附帶源碼)
智慧之水Aqua
加入阿庫(kù)西斯教吧!厄里斯的胸是墊出來的!
81 人贊同了該文章
一.效果預(yù)覽 與 對(duì)比
Volumetic Light性能與表現(xiàn)的取舍之道,總有一款適合那你的項(xiàng)目(文末源碼附上)
1.方案一:RayMarching
特點(diǎn):效果一流且穩(wěn)定,但多次采樣ShadowMap比較消耗性能
2.方案二:光強(qiáng)Threshold + 徑向模糊
特點(diǎn):效果不夠穩(wěn)定,性能消耗適中(有點(diǎn)類似于Bloom的思想)
3.方案三:Noise造假術(shù)
特點(diǎn):需要額外的模型,但特別省性能,表現(xiàn)效果也還不錯(cuò)(如果是面片,則搭配Billboard效果更佳)
4.方案四:擠出造假術(shù)
特點(diǎn):性能高,效果還行。但對(duì)模型頂點(diǎn)數(shù)不能太少,否則模型擠出時(shí)會(huì)被整體偏移(拿一個(gè)Cube試試就知道是啥意思了)
二、具體分析
以下是不同方法的實(shí)現(xiàn)思路,請(qǐng)結(jié)合下載的源碼食用更佳哦
方案一:RayMarching
大體步驟:①深度重建世界坐標(biāo)系 ②步進(jìn)式采樣shadowMap,累計(jì)光強(qiáng) ③模糊算法提高光強(qiáng)質(zhì)感 ④混合體積光與原場(chǎng)景
首先:按照之前文章中提到的RenderFeature小框架,配置好RenderFeature,將RayMarching的RenderPass注入到管線中(到時(shí)候工程源碼里會(huì)放這個(gè)小框架,不必?fù)?dān)心額外下載,想要了解更多的話,這是小框架的講解文章:智慧之水Aqua:URP RenderFeature通用框架(附源碼與使用教程))
后面我們將按照VolumetricLight_RenderPass中,重寫的Render( )函數(shù)展開分析(類似于Build-In中的OnRenderImage函數(shù))
1.1深度重建世界坐標(biāo)系
可參照文章:?智慧之水Aqua:深度重建世界坐標(biāo)系的N種方法(附帶源碼)
1.2步進(jìn)式采樣shadowMap,累計(jì)光強(qiáng)
強(qiáng)烈推薦教我的賽博師傅:?李恒:【UnityShader】Volumetric Light 體積光(8)
接下來就是利用重建好的世界坐標(biāo)系,進(jìn)行shadowMap的采樣了,比如采樣下圖的0, 1, 2, 3點(diǎn)。
比如下圖:如果步進(jìn)4次,那么就會(huì)對(duì)0, 1, 2, 3進(jìn)行ShadowMap采樣,這樣0, 1點(diǎn)就累計(jì)到了光強(qiáng),而2, 3點(diǎn)則沒有。
于是就會(huì)出現(xiàn)這種情況
但明顯能看到分層的情況,這是因?yàn)楫?dāng)步進(jìn)次數(shù)不夠大的時(shí)候,等距采樣會(huì)出現(xiàn)剛好漏過洞口的情況,造成某一段地方的光強(qiáng)累計(jì)不夠,從而出現(xiàn)分層。由此我們可以試試隨機(jī)采樣的效果
但這樣卻多了很多噪點(diǎn),為了優(yōu)化表現(xiàn),我們可以用模糊算法來優(yōu)化
1.3模糊算法提高光強(qiáng)質(zhì)感
模糊算法依舊還是推薦毛大神的?毛星云:高品質(zhì)后處理:十種圖像模糊算法的總結(jié)與實(shí)現(xiàn)
1.4混合體積光與原場(chǎng)景
直接相加就好:sceneColor + lightColor
也可以柔性混合:sceneColor + sceneColor * lightColor
方案二:光強(qiáng)Threshold + 徑向模糊
2.1提取高亮部分:屏幕空間中的燈光距離作為遮罩 + threshold過濾亮度值 = 生成亮度圖
2.2使用徑向模糊:營(yíng)造發(fā)散的效果(這里不展開講徑向模糊,可以參考毛大神的)
2.3混合體積光與原場(chǎng)景
直接相加就好:sceneColor + lightColor
也可以柔性混合:sceneColor + sceneColor * lightColor
方案三:Noise造假術(shù)
3.1造假體積:Noise圖拉長(zhǎng)
3.2邊緣消隱:上圖明顯邊緣太硬了,我們可以用Fresnel + UV擺放形成遮罩,來控制一下邊緣消隱
3.3VertexOffset做開合控制:效果是有了,但不太可控,所以利用遮罩做開合控制
方案四:擠出造假術(shù)
4.1頂點(diǎn)階段的模型擠出:模型沿著背光方向,頂點(diǎn)擠出一定程度
4.2片元階段控制衰減值:讓擠出的部分呈現(xiàn)丁達(dá)爾效應(yīng)
三、工程提供
百度網(wǎng)盤鏈接:https://pan.baidu.com/s/1rSl6rgOTaNO2UWwc-X2uzg?pwd=2233?提取碼:2233
Git鏈接:GitHub - RewriteHJ/Aqua-treasure-of-knowledge: 知識(shí)與你分享~
方案一:RayMarching
文件名:0002Volumetic Light / 0002RayMarchingVolumeticLight.unitypackage
下載后,新建一個(gè)URP工程,拖入Assets覆蓋即可(測(cè)試版本為unity2021.3.26)
方案二:光強(qiáng)Threshold + 徑向模糊
文件名:0002Volumetic Light / 0002RadialBlur_VolumetricLight.unitypackage
下載后,新建一個(gè)build-In工程,拖入Assets覆蓋即可(測(cè)試版本為unity2021.3.26)
方案三:Noise造假術(shù)
文件名:0002Volumetic Light / 0002NoiseTrick_VolumetricLight.unitypackage
下載后,新建一個(gè)build-In工程,拖入Assets覆蓋即可(測(cè)試版本為unity2021.3.26)
方案四:擠出造假術(shù)
文件名:0002Volumetic Light / 0002VertexExtrude_VolumetricLight.unitypackage
下載后,新建一個(gè)build-In工程,拖入Assets覆蓋即可(測(cè)試版本為unity2021.3.26)
四、結(jié)語(yǔ)
總結(jié)的四種Volumetric Light的方法就到這里啦。沉下心來看,其實(shí)體積光特別容易實(shí)現(xiàn)。后續(xù)我還會(huì)更新一些 渲染案例、實(shí)用小工具、Houdini程序化之類的文章,如果能點(diǎn)個(gè)小小的關(guān)注就更好了,嘿嘿,全當(dāng)時(shí)為了阿庫(kù)婭sama。今天的分享就到這啦,下次再見!
B站主頁(yè):智慧之水Aqua的個(gè)人空間-智慧之水Aqua個(gè)人主頁(yè)-嗶哩嗶哩視頻
厄里斯的胸是墊出來的?(? ???ω??? ?)?
發(fā)布于 2023-09-05 00:03