深度緩沖與深度測試的應(yīng)用

前言
今天給大家分享的是游戲當(dāng)中對于深度緩沖非常實(shí)用的一些應(yīng)用的講解,希望給大家?guī)韼椭?/p>
比如說游戲當(dāng)中的掃描效果啊,游戲當(dāng)中的透視效果啊,游戲當(dāng)中的邊緣檢測,邊緣繪制效果啊,游戲當(dāng)中的能量球效果啊等等
特別是大家知道,現(xiàn)在我游戲開發(fā)已經(jīng)進(jìn)入到URP渲染管線的階段了,所以如果你現(xiàn)在在學(xué)習(xí)這些效果的時(shí)候,還是基于內(nèi)置管線進(jìn)行開發(fā)的,那么建議你深入學(xué)習(xí)這些效果,在URP管線下面的實(shí)現(xiàn)儲備好自己的知識和技能,適應(yīng)新的TA技術(shù)迭代
點(diǎn)擊觀看
版權(quán)聲明
本文為“優(yōu)夢創(chuàng)客”原創(chuàng)文章,您可以自由轉(zhuǎn)載,但必須加入完整的版權(quán)聲明
更多學(xué)習(xí)資源請私信我獲?。ㄆ髽I(yè)級性能優(yōu)化/熱更新/Shader特效/服務(wù)器/商業(yè)項(xiàng)目實(shí)戰(zhàn)/每周直播/一對一指導(dǎo))
點(diǎn)贊、關(guān)注、分享可免費(fèi)獲得配套學(xué)習(xí)資源
《無人深空》掃描效果
第一步:C#腳本刷新掃描區(qū)域
深度緩沖可以做什么呢?比如說《無人深空》的掃描效果
這個(gè)效果需要在后處理階段實(shí)現(xiàn)
我們可以利用深度緩沖區(qū)來采樣深度緩沖紋理,采樣到深度緩沖紋理以后,我用深度緩沖紋理的深度值,比如說我們采樣的是場景中間的區(qū)域,假設(shè)我的攝像機(jī)是在離場景比較遠(yuǎn)的,大概在0這個(gè)位置,三角區(qū)域是它的一個(gè)視角范圍,這個(gè)時(shí)候用我從深度圖中采樣到的深度值,跟我當(dāng)前掃描的距離做一下對比
一開始的時(shí)候它從攝像機(jī)的起始位置去掃,比如說我掃距離攝像機(jī)距離為零的位置,然后是一的位置,然后是二的位置,一直掃描到距離為十的位置,我用橫線去表示這個(gè)是距離為十

它掃描的范圍是從距離八到距離十,因?yàn)檎麄€(gè)場景都會被拍到深度圖里面,那我去取比如方塊那里像素點(diǎn)的深度值,假設(shè)這個(gè)深度值是九,這個(gè)時(shí)候算一下,9介于8~10之間,這個(gè)像素就是屬于在掃描效果里面將要去進(jìn)行顏色疊加的像素點(diǎn)
并且9在掃描帶中間,而掃描效果最前面的綠色應(yīng)該是不透明度最高的,那么我就將9的不透明度設(shè)置為比如說0.5,就可以看到一個(gè)半透明的綠色
大家可能平時(shí)在網(wǎng)上去看一些免費(fèi)教程的時(shí)候會發(fā)現(xiàn),這個(gè)效果都是用像我這邊貼的代碼一樣,它是用內(nèi)置管線去實(shí)現(xiàn)的,但實(shí)際上我們的unity現(xiàn)在已經(jīng)進(jìn)入到URP的時(shí)代了
所以我們再這么寫代碼是不行的,因?yàn)檫@樣的代碼就根本就無法工作在URP環(huán)境下,在URP管線下的“掃描效果”的后處理實(shí)現(xiàn),請參考小白的TA之路

在游戲里面也可以用我們的深度測試來去實(shí)現(xiàn)一個(gè)透視效果,那么怎么實(shí)現(xiàn)呢
第一步: 透視效果
透視效果就是以進(jìn)行兩遍渲染這個(gè)地方,我們的核心點(diǎn)是把ZTest設(shè)為Greater,也就是說被遮擋住的部分,反而通過深度測試,將被遮擋角色渲染出來
然后我們再寫一個(gè)pass,這個(gè)pass是把場景里面可以看見的角色,比如說這個(gè)角色按照正常的這種叫做小于測試,也就是深度值較小的物體被渲染,這樣的話就不是渲染我們的墻背后的物體,而是墻前面的這個(gè)物體
核心代碼如圖:

第二步:邊緣光
當(dāng)然你也可以給這個(gè)效果效果去加一些邊緣光的處理

上面寫的這個(gè)代碼是內(nèi)置管線的代碼,內(nèi)置管線可以寫N多個(gè)pass,這些pass都會被我們的引擎逐個(gè)執(zhí)行,但是在URP管線下面,并不是寫一個(gè)他就執(zhí)行一個(gè),Unity只會執(zhí)行特定的Pass
護(hù)盾/能量場效果
第一步:半透明能量場
通過將能量場模型放在半透明隊(duì)列,可以確保它在所有不透明物體繪制完畢后被繪制,并與不透明物體進(jìn)行顏色混合,從而形成半透明效果

如果你不把它放到半透明隊(duì)列里,那么這個(gè)時(shí)候在我們進(jìn)行能量球的擾動,它因?yàn)槟芰壳驎χ車目諝庠斐蓴_動,做空氣擾動的時(shí)候,就不能夠?qū)χ車牟煌该魑矬w來進(jìn)行擾動,因?yàn)槲覀冎腊胪该魑矬w是在不透明物體之后被渲染的
第二步:邊緣光
我們要實(shí)現(xiàn)一個(gè)邊緣光,那么這個(gè)邊緣光的強(qiáng)度怎么計(jì)算呢?

abs(dot(i.normal,normalize(i.viewDir)));??//邊緣光的計(jì)算,法向量與視向量進(jìn)行點(diǎn)乘
傳統(tǒng)的費(fèi)尼爾效果用的是pow,但這里要用abs;關(guān)于為什么要用abs,如果感興趣的話大家可以在評論區(qū)討論
第三步:相交高亮

我們可以看到圓球底下交界的位置都有一圈高亮,那這個(gè)高亮是怎么樣去實(shí)現(xiàn)呢?這里就要用到深度緩沖區(qū)的知識
假設(shè)能量球頂部的這個(gè)點(diǎn),從場景頂部的物體視角看過去,它的背后是背景,因此不跟場景里面的物體相交接
背景的深度值是1.0,那么這個(gè)位置的深度值可能是0.5或者0.3,算一下這個(gè)點(diǎn)的能量球的深度值跟他背后的物體的深度值的深度差,如果深度差比較大,那就說明不是物體相交的部分,這時(shí)候我們正常渲染這個(gè)能量球就可以了
因?yàn)槲覀兌ㄎ坏纳疃戎蹈芰壳蛟谶@個(gè)位置的深度值是幾乎差不多的,所以我們就應(yīng)該把它渲染成高亮的一個(gè)顏色
如上圖所示,紅色方框中的算法是相交高亮的算法
第四步:表面扭曲

扭曲效果在我們早期的內(nèi)置管線里面,我們直接用一個(gè)Pass就能實(shí)現(xiàn)了
但是我前面講過:
GrabPass也是一個(gè)pass
URP不是寫一個(gè)pass,unity就去執(zhí)行一個(gè)pass
URP管線執(zhí)行Pass是有條件的,這樣的效果在URP管線里面如何實(shí)現(xiàn)大家呢?請參考小白的TA之路
深度緩沖的其他應(yīng)用
當(dāng)然深度緩沖,其實(shí)還有其他的一些應(yīng)用,比如說可以用它來做二次元的效果,通常都要做邊緣檢測,這個(gè)怎么做
比如說我們用深度緩沖可以用來去做水的渲染,那這個(gè)具體又該怎么做呢?老師都會給大家去詳細(xì)的分析每一個(gè)效果的實(shí)現(xiàn)原理
... ...
這邊也會不定期的去開設(shè)一些公開課,去給大家去做相關(guān)的技術(shù)分享,感興趣的小伙伴可以進(jìn)群交流
URP渲染管線定制

在很多在內(nèi)置管線的圖形渲染資料中,比如說跟馮樂樂的入門精要中我們學(xué)到的一些效果,當(dāng)你到了URP管線下的時(shí)候,就發(fā)現(xiàn)它實(shí)現(xiàn)起來,根本不是那么回事,而我們的TA崗位面試,公司都會有要求能夠掌握在URP管線下如何進(jìn)行渲染效果的開發(fā)
那這樣的話就要求我們的TA同學(xué)不僅僅掌握Shader開發(fā)的知識,還要掌握C#腳本開發(fā)的知識,因?yàn)橹挥姓莆樟?,才能夠進(jìn)行所謂的渲染管線的定制,去實(shí)現(xiàn)這樣的效果
URP渲染管線定制不僅僅可以幫我們實(shí)現(xiàn)渲染效果,也可以幫我們實(shí)現(xiàn)渲染優(yōu)化
下面圖示在2019開發(fā)者大會上面,有開發(fā)者分享了一個(gè)使用URP渲染管線可以優(yōu)化渲染性能,更容易處理一些渲染上面的一些問題
寫在最后
更多學(xué)習(xí)資源請私信獲取(企業(yè)級性能優(yōu)化/熱更新/Shader特效/服務(wù)器/商業(yè)項(xiàng)目實(shí)戰(zhàn)/每周直播/一對一指導(dǎo))
點(diǎn)贊、關(guān)注、分享可免費(fèi)獲得配套學(xué)習(xí)資源
【TA進(jìn)階】深度緩沖與深度測試的4個(gè)應(yīng)用