unity中的陰影

2021-10-12 15:24:57 字數 2012 閱讀 2077

shadowmap技術原理是,將攝像機與光源的位置重合,場景中光源的陰影位置就是攝像機看不到的位置。

在forward rendering path中,場景中最重要的平行光在forwardbase中預設是開啟了陰影的,unity就會為該光源計算其shadowmap(陰影對映紋理),這張紋理的本質也是一張深度圖,這張深度圖上的資訊記錄了,從光源的位置出發,能看到的場景中距離它最近的表面的資訊。

為了得到這張shadowmap我們按照正常的流程應該是呼叫base pass和addition pass來更新深度資訊,但是因為這兩個pass中涉及到許多光照模型的計算,因此我們為了節省效能,我們應該寫乙個新的pass名為「shadowcaster」,這個pass來專門更新光源的shadowmap。

當開啟了光源的陰影效果之後,底層的渲染引擎會優先在shader中尋找lightmode為shadowcaster的pass,如果沒有他就會在fallback指定的shader中繼續尋找。

對於獲取shadowmap是一種傳統的方法,但在之後的unity中使用了一種新的技術為:螢幕空間的陰影對映技術(screenspace shadow map),這種技術原本是延遲渲染中產生陰影的方法,而且移動平台不支援這種技術。

screenspace shadow map中對陰影的計算是在平面空間中進行的,對於螢幕空間的陰影實現的步驟分為以下:

1、首先得到從當前攝像機觀察到的深度紋理(在延遲渲染裡的這張深度圖本身就存在,但是如果是forward rendering就需要重新將整個場景渲染一遍,將深度渲染到深度圖中)

2、然後得到光源的shadowmap

3、然後在螢幕空間做一次陰影收集計算,這次的計算會得到一張螢幕空間陰影紋理, 這次的計算就是將每乙個畫素根據它在camera中的depth map得到世界空間座標,再將其座標從世界空間轉換到光源空間,和光源的shadowmap裡面的depth對比,如果大於shadowmap中的深度距離,那麼就說明光源無法照到,在陰影內。

4、最後一步就是將正在處理的畫素在螢幕空間中的位置和步驟3中的得到的螢幕空間陰影紋理進行取樣。

總結一下就是:camera的depth map( this.getcomponent().depthtexturemode = depthtexturemode.depth;)//開啟相機或許深度圖

light的shadowmap

根據兩者得到的螢幕空間陰影紋理

總的來說上面新的方法我不太明白,以下是另一位的解釋的shadowmap:

首先我們要確定的是,陰影和camera的位置無關,只與遮擋物和光源的位置有關。

1、render to texture!首先在light位置放置乙個相機,和light保持相同的引數,如果是平行光則為正交相機,如果是點光源則為透視相機,然後我們得到了一張深度圖也就是shadowmap

float4 worldpos=mul(worldmatrix,pos);//將當前座標轉換到世界空間

float distance =(worldpos-lightpos).length;

//計算當前點的世界座標和燈光的世界座標的距離

2、根據深度圖中的距離和計算點到燈光的實際距離進行比較,這裡我們要明確一點的是,實際相機的位置對我們來說並不重要,因為陰影和實際相機的位置並沒有關係,陰影的產生只和燈光的位置、方向和遮擋物有關,因此我們需要比較的兩個變數是ob和oc,在shadowmap上的距離就是oc,因為ob比oc大,因此b點我們可以判斷出在陰影區處。

偽**如下:

float depth = (worldpos - lightpos).length;

float depthshadowmap = tex2d(shadowmap, uvshadow);

if(depth > depthshadowmap)

else

unity螢幕空間陰影

參考 實驗的原理很簡單 1 從攝像機角度拍攝一張深度圖,為cameradepth 2 從燈光角度拍攝一張深度圖,為lightdepth 3 將兩個圖blit,重建世界座標點,轉換到燈光空間,取樣燈光空間的深度,比較,然後判斷是否在陰影裡,最後生成乙個新的圖,記作screenspaceshadowte...

AR 中的陰影與浮現效果 (Unity實現)

增強現實作為一種互動方式是用來承載內容的。用它來承載 2d 內容,就像是給我們原本的世界增添了一些資訊 而用它來承載 3d 內容,就會給人一種將虛擬物體帶入到現實中的感覺。這裡我們將使用 高通 unity 的方式來實現 3d 效果,並討論如何新增陰影及如何使虛擬物體浮現出來。最後通過編譯執行,我們就...

Unity 實時陰影新方案

大家都知道,實時光產生陰影的效能開銷很大,為了在移動端有更好的效能表現,所以在網上參考了一些方案,總結了乙個陰影shader去解決實時光效能開銷過大的問題。1.陰影shader,產生陰影的物體需要使用這個shader shader custom playershadow shadowinvlen s...