0x00 前言

本文是《有趣的深度圖》的第二篇文章,上一篇文章《有趣的深度圖:可見性問(wèn)題的解法》中已經(jīng)和大家介紹了深度圖在解決可見性問(wèn)題中的應(yīng)用。其實(shí),利用深度信息我們可以實(shí)現(xiàn)很多有趣而又顯得“高大上”的效果。
不過(guò)這些效果雖然看上去高大上,但是一旦了解了原理就會(huì)發(fā)現(xiàn)實(shí)現(xiàn)這種效果其實(shí)是十分簡(jiǎn)單的。
那么本文會(huì)包括以下四個(gè)有趣的效果在Unity中的實(shí)現(xiàn):

  • 有點(diǎn)科幻的掃描網(wǎng)

  • 透過(guò)墻壁繪制背后的“人影”

  • 護(hù)盾/能量場(chǎng)效果

  • 邊緣檢測(cè)

回到目錄

0x01 獲取深度信息

為了利用深度信息來(lái)實(shí)現(xiàn)若干效果,我們首先需要獲取場(chǎng)景的深度信息。在移動(dòng)游戲開發(fā)中常用的前向渲染路徑(Forward Rendering)下,我們需要手動(dòng)設(shè)置相機(jī),讓它提供場(chǎng)景的深度信息。

camera.depthTextureMode = DepthTextureMode.Depth;

如果在延遲渲染路徑(Deferred Lighting)下,由于延遲渲染需要場(chǎng)景的深度信息和法線信息來(lái)做光照計(jì)算,所以并不需要我們手動(dòng)設(shè)置相機(jī)。

這樣我們就可以在shader中訪問(wèn)_CameraDepthTexture來(lái)獲取保存的場(chǎng)景的深度信息,之后再利用UNITY_SAMPLE_DEPTH這個(gè)宏來(lái)處理_CameraDepthTexture的值,這樣我們就獲取了某個(gè)像素的深度值。

float depth = UNITY_SAMPLE_DEPTH(tex2D(_CameraDepthTexture, uv));

但是正如上一篇文章中所說(shuō),此時(shí)的深度值并非是線性的,因此我們常常需要利用另一個(gè)內(nèi)建的方法Linear01Depth將結(jié)果轉(zhuǎn)化為線性的。這樣,我們就能將場(chǎng)景的深度信息渲染為一張灰度圖。

        		

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式