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)景的深度信息渲染為一張灰度圖。
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線安全]玩轉(zhuǎn)無(wú)線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26