深度影象資訊的應用
一、Unity獲取深度影象
1.在Unity中由於是Forward Shading,前向渲染,所以我們需要設定攝像機可以獲取深度資訊,如果是Deferred Shading ,延遲渲染的話就不用手動設定獲取深度資訊。
2.我們需要新建一個Shader檔案用於獲取攝像機所捕獲到的畫面的深度資訊。當我們開啟獲取深度資訊後,我們可以通過引數 _CameraDepthTexture 來獲取每個畫素點深度資訊,然後利用內建的巨集UNITY_SAMPLE_DEPTH來處理深度資訊,但是由於獲取的深度資訊不是線性的,所以需要用Linear01Depth來將深度資訊轉換為線性,這樣就能將深度資訊渲染成一張灰度圖。
/************************************************************************************華麗的分割線********************************************************************************************/
二、利用深度資訊做光線掃描效果
掃描效果這種全屏特效,可以通過獲取攝像機渲染到的一副畫面,然後我們通過深度資訊對畫面的每個畫素點進行處理,當掃描線經過的地方就將掃描線的顏色與物體的顏色進行疊加,並且為了有掃描線的效果,我們需要加入掃描線寬度的概念。
1.首先還是先獲取攝像機當前畫面的深度資訊,然後線性化後渲染成一副圖。
2.線性化後的圖的深度在被限制在【0,1】, 掃描距離通過cs指令碼與時間和掃描線的移動速度來計算求得,也需要限制在【0,1】,同時由於當線性化後的深度值為1是,代表攝像機的遠裁切面,所以不能為1,否則整個螢幕都會被掃描線刷過。
3.在cs指令碼中,我們用來計算掃描線的具體距離。
4.我們需要OnRenderImage函式來回調渲染畫面。
/************************************************************************************華麗的分割線********************************************************************************************/
三、透過牆看到牆後物體的輪廓描邊
許多遊戲中都會有,對於在牆後的敵人,給予外形描邊顯示。實現原理即設定兩個Pass塊,第一個Pass用來計算被遮擋物體的顏色顯示,第二個pass來計算未被遮擋時的正常顯示。而由於很多遊戲中人物的描邊都不只是最外邊的描邊,所以可以通過面向攝像機的觀察方向與物體法線方向的夾角來判斷物體的描邊。
1.首先新建一個Shader檔案,定義一個描邊顏色用以給牆後的物體描邊。由於物體是在牆後,在深度資訊圖中,物體的Z值是大於牆的Z值的,所以我們需要設定ZTest Greater,同時使用Blend 混合指令將被遮擋物體與其他物體進行混合。
2.在Vertex Shader中,分別獲得物體法線和攝像機看向物體的方向,傳入Fragment Shader中計算夾角。
3.在Fragment Shader中去計算視線方向與物體法線的夾角,將夾角與邊緣輪廓顏色進行疊加後輸出。
4.在另外一個Pass裡處理未被遮擋時物體的顏色.
/************************************************************************************華麗的分割線********************************************************************************************/
四、能量場/護盾效果
1. 能量場是一個透明物體,所以啟用Blend混合指令,對片斷著色器輸出後的顏色的Alpha進行混合(Blend SrcAlpha OneMinusSrcAlpha).然後設定渲染型別和佇列為透明.
2.根據觀察方向和物體法線的夾角來計算能量場的邊緣.
3.實現相交高亮的效果.需要注意的是_CameraDepthTexture中只儲存了不透明物體的深度資訊,因此是無法獲取能量場的深度資訊,所以要在vertex shader中計算出能量場的頂點的深度,利用COMPUTE_EYEDEPTH 巨集.分別計算場景和能量場的片段著色器中的深度,然後求出深度的差異diff,然後用1-diff就求出了相交程度.
4.實現能量場的扭曲效果.原理即一張渲染能量場之前的場景的渲染圖,然後隨著時間去調整UV的偏移來模擬扭曲的效果.
參考來源於 https://zhuanlan.zhihu.com/p/27547127 版權所有歸原作者,本文只做個人學習記錄使用.