Unity快速實現平行光體積光(URP)

2022-06-22 20:45:11 字數 1589 閱讀 5080

體積光的光源可以是平行光、探照燈、點光源等,我們今天先來看看平行光如何製作體積光。

體積光的原理網上已經有很多了,這裡就不贅述了。著重快速實現:

shader "

unlit/volumetriclightingshader

" _intensity(

"intensity

",float) = 1

} subshader

lod

100pass

;struct

v2f ;

texture2d_x_float(_cameradepthtexture); sampler(sampler_cameradepthtexture);

texture2d(_cameraopaquetexture); sampler(sampler_cameraopaquetexture);

texture2d(_maintex); sampler(sampler_maintex);

float

_intensity;

half4 frag (v2f i) : sv_target

color /=step_time;

color +=scenecolor;

return half4(color.xyz,1

); }

endhlsl}}

}

**如上,可以看到體積光的基礎實現非常簡單,在片元著色器步進取樣shadowmap,看當前步進的位置是否處於陰影區域,如果不處於陰影區域,就疊加強度,最後形成散射效果。

此shader直接掛在乙個quad片上,能把相機遮住就ok,這種方式適合快速實現各種螢幕空間的效果,等效果覺得ok了,然後再慢慢的轉移到urp的renderfeature中。

用quad片直接放在相機前面製作上有以下好處:

1.不需要寫任何c#**,乙個shader檔案全搞定

2.不需要計算螢幕空間近裁切面的世界座標的位置,直接取片的position就可以,非常的方便

3.快,主要就是快,這裡指的快是寫**敲得快,哈哈哈~

shader有兩個引數,第乙個引數是傳入一張紋理,這裡需要傳入雜訊紋理,最好是blue noise,這個紋理是用來dither步進距離特別大的時候產生的分層效果,使得分層感不那麼明顯。通過調整「#define step_time 64」中的數值來控制步進次數。這裡可以看一下沒有dither(上圖)和有dither(下圖)的效果對比:

可以看到分層感的改善還是非常明顯的。需要注意的是這裡的實現只是簡單的步進疊加強度,沒有進行任何的散射演算法實現,常用的散射演算法有公尺氏散射瑞利散射,各位童鞋可自行檢視,套用公式即可,這裡給出這個框架,公式隨便套~

1.raymarching

2.基於深度還原世界座標

3.shadowmap的實現原理

Unity快速接入SDK框架

先把工程原始碼貼出來 最近接android ios的sdk 已經接了10多個 有點心得 分享一下 如果有更好想法求告知 解壓 sdkframework.zip 可以得到三個資料夾 分別是 框架unity工程 安卓工程所需要的檔案 xcode工程所需要的檔案 使用unity開啟 框架unity工程 接...

unity快速開發問答遊戲

最近又趕上做畢設的時間了,很多同學都在網上找人做畢設。作為乙個勤奮自強的好青年,我才不會做那種花錢買畢設的事,當然是要自己做畢設了。用unity做畢設實際上很簡單,我們也不是做多複雜的專案。只要把基本功能都實現出來,看起來沒有bug,一般就可以通過了。而且網上也有很多教程,可以供我們邊看邊學邊做。今...

Unity血條實現

最近開發一款遊戲,涉及到血條的製作,前期上網找了挺多文章,最後總結起來應該就如下幾種實現方式 1.通過slider實現 2.通過scrollbar實現 3.控制項組合,比如用控制項將血條邊框和紅條組合,通過指令碼控制紅條長度的縮放或位移實現動畫效果 okay,為了省事,我選擇了通過scrollbar...