0x00 前言
本文是《有趣的深度圖》的第二篇文章,上一篇文章《有趣的深度圖:可見性問題的解法》中已經(jīng)和大家介紹了深度圖在解決可見性問題中的應用。其實,利用深度信息我們可以實現(xiàn)很多有趣而又顯得“高大上”的效果。
不過這些效果雖然看上去高大上,但是一旦了解了原理就會發(fā)現(xiàn)實現(xiàn)這種效果其實是十分簡單的。
那么本文會包括以下四個有趣的效果在Unity中的實現(xiàn):
有點科幻的掃描網(wǎng)
透過墻壁繪制背后的“人影”
護盾/能量場效果
邊緣檢測
0x01 獲取深度信息
為了利用深度信息來實現(xiàn)若干效果,我們首先需要獲取場景的深度信息。在移動游戲開發(fā)中常用的前向渲染路徑(Forward Rendering)下,我們需要手動設置相機,讓它提供場景的深度信息。
camera.depthTextureMode = DepthTextureMode.Depth;
如果在延遲渲染路徑(Deferred Lighting)下,由于延遲渲染需要場景的深度信息和法線信息來做光照計算,所以并不需要我們手動設置相機。
這樣我們就可以在shader中訪問_CameraDepthTexture來獲取保存的場景的深度信息,之后再利用UNITY_SAMPLE_DEPTH這個宏來處理_CameraDepthTexture的值,這樣我們就獲取了某個像素的深度值。
float depth = UNITY_SAMPLE_DEPTH(tex2D(_CameraDepthTexture, uv));
但是正如上一篇文章中所說,此時的深度值并非是線性的,因此我們常常需要利用另一個內(nèi)建的方法Linear01Depth將結(jié)果轉(zhuǎn)化為線性的。這樣,我們就能將場景的深度信息渲染為一張灰度圖。
網(wǎng)友評論