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