淺做一個(gè)MetaBall
Raymaching其實(shí)就是實(shí)時(shí)場(chǎng)景的一種渲染方法。主要原理網(wǎng)上有很多詳細(xì)介紹。簡(jiǎn)單來說就是,以攝像機(jī)為原點(diǎn),發(fā)射很多條射線,而每一條射線以步長(zhǎng)為單位向前采樣,同時(shí)以采樣點(diǎn)和最近的物體像素的距離為半徑進(jìn)行一個(gè)球形檢測(cè)。檢測(cè)到攝像機(jī)和場(chǎng)景像素在當(dāng)前射線方向的距離差小于某個(gè)值,就表示射線到達(dá)物體表面,然后畫這個(gè)像素。
圖片來源于以上鏈接視頻
開始在unreal里面進(jìn)行簡(jiǎn)單的實(shí)現(xiàn)
首先上才藝
圖片僅供參考,具體以實(shí)物為準(zhǔn)
1. custom節(jié)點(diǎn)算出球體
先上代碼
float distance = length(pos-ObjectPosition)-50;
減去50表示小球的半徑
2. 去掉被遮擋的部分
為了對(duì)算法進(jìn)行優(yōu)化,我們可以去掉球體被遮擋的部分,比如說地面以下的部分。
判斷場(chǎng)景深度是否小于攝像機(jī)到物體像素的距離,小球處于地面以下后,深度值就會(huì)取平面的深度值,所以如果深度值小于攝像機(jī)到像素距離的話,不進(jìn)行檢測(cè)。
3. 添加法線
求法線就簡(jiǎn)單粗暴的對(duì)檢測(cè)結(jié)果求一個(gè)梯度變化,設(shè)定一個(gè)值,求在這個(gè)值前后的檢測(cè)結(jié)果的插值。最后把normal的信息也輸出出來。具體結(jié)果如下
注意材質(zhì)球的normal要取消勾選targent space normal,因?yàn)樗愠鰜淼氖且粋€(gè)世界法線
4. 跟地面的融合效果
主要就是一個(gè)分段函數(shù),d1是檢測(cè)出來的小球,d2是與其相交的一個(gè)物體的距離場(chǎng),k表示兩個(gè)相交的物體在相交那部分的一個(gè)過渡值,即達(dá)到這個(gè)值開始相交。
所以d1 = RM.RMSphere(pos-ObjectPosition);
而d2,這里用深度代替距離場(chǎng),就等于射線方向上那個(gè)物體對(duì)應(yīng)的場(chǎng)景深度減去攝像機(jī)到小球像素的距離
float d2 = SceneDepth - length(pos - CameraPosition);
這里混合d1和d2用lerp。
最終效果
調(diào)整采樣步數(shù)等可以解決邊緣鋸齒,但是性能計(jì)算會(huì)更大,目前還沒有找到一個(gè)更好的解決辦法。
以上就是影晨文化對(duì)淺做一個(gè)MetaBall的簡(jiǎn)單介紹,記得持續(xù)關(guān)注我們哦,如有不足之處,希望大家可以一起交流學(xué)習(xí),一起變得更強(qiáng)!如果有廣州三維動(dòng)畫制作的需求,可以隨時(shí)找到影晨文化哦!
標(biāo)簽為: