最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

3D引擎核心解密: 渲染隊(duì)列 ZTest ZWrite機(jī)制

2021-05-22 13:53 作者:博毅創(chuàng)為  | 我要投稿

傳統(tǒng)的畫家算法存在的問題

畫家算法指的是,畫家往畫布上繪畫的時(shí)候,先繪制遠(yuǎn)方的景物,再繪制近處的,一層層疊加在一起后,形成完整的一幅畫。

傳統(tǒng)畫家算法會(huì)有一個(gè)嚴(yán)重的問題,畫布上的某一個(gè)點(diǎn),可能會(huì)反復(fù)的多次涂上不同的顏色(同一個(gè)點(diǎn),有幾個(gè)景物疊加在此處)。假設(shè)有5個(gè)景物由遠(yuǎn)到近都在畫布上某個(gè)點(diǎn)繪制,根據(jù)畫家算法,先繪制物體1,再繪制物體2,最后繪制物體5,同一個(gè)點(diǎn)被涂了5次,但是只有最后這一次的顏色是有效的,其他的4次都是無效的。關(guān)鍵是每次著色,3D引擎都要計(jì)算顏色,光照,計(jì)算完著色上去后卻沒有用,這樣消耗性能的無用功,3D游戲引擎必須要很好的優(yōu)化它。

由近到遠(yuǎn)繪制,逆畫家算法

分析出來了畫家算法的問題,接下來是著手解決,游戲引擎采用的方式是反畫家算法由近到遠(yuǎn)繪制。畫家的畫布,相當(dāng)于是游戲的屏幕,畫布上的每個(gè)點(diǎn),相當(dāng)于屏幕上一個(gè)個(gè)著色單元元(像素)。游戲引擎繪制物體的時(shí)候,先對(duì)物體進(jìn)行排序, 離攝像機(jī)最近的物體排在渲染序列的前面,離攝像機(jī)越遠(yuǎn)的物體排在后面。遍歷每個(gè)物體,針對(duì)每個(gè)物體的著色片元(物體要繪制到屏幕上的每個(gè)點(diǎn)),如果屏幕著色點(diǎn)已經(jīng)被更靠近攝像機(jī)的物體片元給占據(jù)了,那這個(gè)片元不用去計(jì)算光照著色,可以直接丟棄,如果沒有或更靠近攝像機(jī),就繪制這個(gè)片元,并把片元距攝像機(jī)的深度信息保存起來,下一個(gè)片元來繪制的時(shí)候,就和這個(gè)深度信息做比較,如果離得更近,那么就替換原來得,如果遠(yuǎn)就丟棄,不著色。

我們結(jié)合上圖把算法實(shí)現(xiàn)完整的分析一遍。我們把屏幕畫布分成一個(gè)的著色點(diǎn)(像素),每個(gè)著色點(diǎn)我們?yōu)樗峙湟粋€(gè)顏色緩存,一個(gè)深度緩存。顏色緩存用來存放屏幕著色點(diǎn)的顏色信息(RGBA),深度緩存用來存放屏幕著色點(diǎn)的深度信息(距離攝像機(jī)的z值)。游戲引擎,根據(jù)物體距離攝像機(jī)的遠(yuǎn)近,將物體的繪制順序排序?yàn)椋合壤L制綠色物體A,再繪制藍(lán)色物體B。繪制綠色物體A的時(shí)候,需要占據(jù)屏幕的著色點(diǎn)綠色的區(qū)域(如圖),而這些區(qū)域,剛開始沒有被任何物體的著色片元寫入過,將物體A著色片元(物體A需要繪制到屏幕上的像素點(diǎn))的顏色(綠色)寫入屏幕著色點(diǎn)的顏色緩存,并更新屏幕著色點(diǎn)的深度信息為物體A著色片元的深度信息。接下來繪制藍(lán)色的物體B, 它需要占用屏幕中的藍(lán)色的屏幕區(qū)域著色點(diǎn)。如上圖,外圍一圈的屏幕著色點(diǎn),沒有任何物體著色過,所以直接將物體B的著色片元顏色(藍(lán)色)寫入顏色緩存,并更新對(duì)應(yīng)屏幕著色點(diǎn)的深度信息為藍(lán)色片元的深度。當(dāng)著色藍(lán)色物體被綠色物體擋住部分的時(shí)候,發(fā)現(xiàn)屏幕上的著色點(diǎn)的深度信息是之前綠色片元的深度,而當(dāng)前藍(lán)色片元的深度,要更遠(yuǎn)離攝像機(jī),所以不用著色,直接丟棄。這樣被綠色擋住的藍(lán)色物體的片元就不用計(jì)算著色了。

新的算法,也會(huì)引入新的問題

由近至遠(yuǎn)的繪制算法避免了物體被遮擋部分的不必要的物體片元著色計(jì)算,但是也帶來了一個(gè)新問題:Alpha透明度。同樣如上圖,如果綠色物體是一個(gè)半透明物體,希望透過綠色物體,能看到藍(lán)色物體,那么上面的算法先繪制綠色的物體,綠色的半透寫入顏色緩存(藍(lán)色物體還沒有進(jìn)來), 而后面藍(lán)色物體被綠色物體擋住的片元不會(huì)寫入顏色緩存,直接丟棄就會(huì)出現(xiàn)下圖的效果:

這可不是我們想要的結(jié)果,可是我們由近到遠(yuǎn)的繪制,必然會(huì)產(chǎn)生這樣的結(jié)果。那怎么辦呢?游戲引擎又設(shè)計(jì)了一個(gè)機(jī)制,把要繪制的物體分成一個(gè)一個(gè)的渲染隊(duì)列,如下圖,我們一起來看下,半透效果是怎么做到的。

游戲引擎會(huì)為每個(gè)游戲物體指定一個(gè)渲染隊(duì)列,每個(gè)渲染隊(duì)列會(huì)有一個(gè)數(shù)值大小,游戲引擎根據(jù)物體所在渲染隊(duì)列先將要繪制的物體排序到渲染隊(duì)列中。如下

?? 渲染隊(duì)列A(2000):物體A,物體B,物體C 。。。(由近到遠(yuǎn))

?? 渲染隊(duì)列B(3000):物體1,物體2,物體3 。。。(由近到遠(yuǎn))


游戲引擎先繪制數(shù)值小的渲染隊(duì)列中的物體,再繪制數(shù)值大的渲染隊(duì)列中的物體。上圖的綠色物體A,在3000的渲染隊(duì)列, 藍(lán)色物體B,在2000的渲染隊(duì)列,所以游戲引擎先渲染渲染隊(duì)列2000的物體,那么藍(lán)色物體B的每個(gè)片元顏色,就寫入了顏色緩沖區(qū),屏幕著色點(diǎn)深度信息也是物體B片元的深度信息。繪制完2000的渲染隊(duì)列后,顏色緩存中就是藍(lán)色了。接下來繪制渲染隊(duì)列3000中的物體,綠色物體A比藍(lán)色物體B距離攝像機(jī)要近,所以綠色物體的片元顏色就可以寫入到屏幕著色點(diǎn)顏色緩存區(qū),根據(jù)Alpha混合,疊加顏色緩存之前的顏色,計(jì)算新出新的顏色寫入顏色緩存,這樣就實(shí)現(xiàn)了半透效果,并更新屏幕著色點(diǎn)的深度值為綠色片元深度值。

ZTest, ZWrite, Blend

經(jīng)過上面的講解,相信大家對(duì)3D引擎的著色有了一個(gè)比較深刻的認(rèn)識(shí),接下來就是擺概念的時(shí)候了,我們一起來加深一下。

??深度測(cè)試ZTest: 每個(gè)要渲染的物體的著色片元著色到屏幕的著色點(diǎn)時(shí)候,首先要到屏幕著色點(diǎn)的深度緩存里面判斷一下,是否更靠近攝像機(jī),更近的才著色,否則直接丟棄。這個(gè)過程我們叫做深度測(cè)試或ZTest。"更近"就是通過深度測(cè)試的法則,只有通過了,才會(huì)被寫入顏色緩存。為了更好的靈活性,引擎可以給用戶改變這個(gè)測(cè)試規(guī)則,默認(rèn)是更近(LESS),用戶也可以修改成更遠(yuǎn)(GREATE), 永遠(yuǎn)可以通過測(cè)試(ALLWAS)等。

?深度值寫入 ZWrite:?當(dāng)我們物體上的著色片元通過測(cè)試可以著色以后,我們的Shader會(huì)計(jì)算出顏色值,把顏色值寫入屏幕著色點(diǎn),此時(shí)屏幕著色點(diǎn)的深度值應(yīng)該就是這個(gè)物體著色片元的深度值。更新完顏色后,就要往深度緩存里面更新深度值,這樣后續(xù)比當(dāng)前深度更遠(yuǎn)的物體著色片元就不會(huì)繪制了。引擎也提供一個(gè)開關(guān),可以讓開發(fā)者控制,決定是否寫入深度緩存, 默認(rèn)ZWrite是開啟的,你也可以設(shè)置為關(guān)閉,這樣,物體的顏色寫入顏色緩存后,不會(huì)刷新深度緩存。還是上面的例子,綠色物體與藍(lán)色物體,我們把綠色物體的深度寫入關(guān)閉,你會(huì)發(fā)現(xiàn)藍(lán)色物體被綠色物體遮擋了也繪制到屏幕上了。

顏色混合Blend:?當(dāng)經(jīng)過深度測(cè)試,物體著色片元通過以后,就要計(jì)算著色,并寫入顏色緩存里,這個(gè)時(shí)候就需要處理混合當(dāng)前顏色與目標(biāo)顏色,顏色混合,我們又叫Blend操作。默認(rèn)的Blend是顏色直接覆蓋。還有一些常用的顏色混合的方法,比如Alpha混合等。Blend指的是混合片元顏色與顏色緩存區(qū)顏色,并更新到顏色緩存里。下面是游戲引擎里面支持的Blend操作,我總結(jié)了一下,常用的標(biāo)紅出來了,如下圖:

? 終于講完了渲染隊(duì)列,ZTest, ZWrite, Blend,如果還不過癮,今晚20:30分,可以來到我們騰訊課堂

附視頻教程 點(diǎn)擊可直接學(xué)習(xí)

3D引擎核心解密: 渲染隊(duì)列 ZTest ZWrite機(jī)制

https://bycwedu.vipwan.cn/promotion_channels/595061789

為視頻教程制作者Blake老師打CALL?




3D引擎核心解密: 渲染隊(duì)列 ZTest ZWrite機(jī)制的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
宿州市| 珲春市| 永定县| 莒南县| 连平县| 柳州市| 昆明市| 寿光市| 靖江市| 承德县| 石家庄市| 木里| 图片| 雅安市| 大悟县| 沂南县| 合阳县| 铅山县| 平和县| 霍山县| 永安市| 白山市| 大同县| 长岛县| 阿城市| 尚义县| 黄浦区| 丘北县| 涿州市| 信宜市| 科技| 咸宁市| 巴马| 磐安县| 海口市| 镇赉县| 苏尼特右旗| 兖州市| 兰州市| 舒兰市| 寿阳县|