前面的幾篇博客講了游戲渲染的基本原理和如何在Unity里寫一個Shader,這篇博客先插入兩個概念:
在Unity中我們會有很多的物體,這些物體是不是同時渲染,渲染的順序是怎樣的,覆蓋關(guān)系又是怎樣的?我們一起看一下會影響的一些因素。
這個屬性表明的是相機的深度,如果場景中存在多個攝像機,深度越大的越靠后,也就是說,深度大的攝像機的內(nèi)容會直接覆蓋在深底小的攝像機的內(nèi)容上。
相對于Sorting Layer的子排序,用這個值做比較時只有都在同一層時才有效。
soringOrder也是Render的一個屬性,這個order是設(shè)置一個數(shù)字,數(shù)字越大,越在上面顯示。
默認(rèn)情況下,Unity會基于對象距離攝像機的遠(yuǎn)近來排序你的對象。因此,當(dāng)一個對象離攝像機越近,它就會優(yōu)先繪制在其他更遠(yuǎn)的對象上面。對于大多數(shù)情況這是有效并合適的,但是在一些特殊情況下,你可能想要自己控制對象的繪制順序。而使用Tags{}塊我們就可以得到這樣的控制。
Unity提供給我們一些默認(rèn)的渲染隊列,每一個對應(yīng)一個唯一的值,來指導(dǎo)Unity繪制對象到屏幕上。這些內(nèi)置的渲染隊列被稱為Background, Geometry, AlphaTest, GeometryLast,Transparent, Overlay。這些隊列不是隨便創(chuàng)建的,它們是為了讓我們更容易地編寫Shader并處理實時渲染的。
同時需在SubShader中顯示聲明ZWrite Off,通知Unity我們會重寫物體的渲染深度排序。
當(dāng)上面的要素都相同的時候,比如有幾個建筑物從攝像機看過去是層層遮擋的,那么最后渲染哪個,取決于該物體與攝像機之間的距離。
講完了渲染順序,我們講一下Unity中另外一個很相似的名詞,叫做渲染路徑
Unity 的內(nèi)置渲染管線支持不同渲染路徑。渲染路徑是與光照和陰影相關(guān)的一系列操作。不同的渲染路徑具有不同功能和性能特征。應(yīng)根據(jù)項目類型以及目標(biāo)硬件,確定哪種渲染路徑最適合您的項目。
可在 Graphics 窗口中選擇項目使用的渲染路徑,并可為每個攝像機覆蓋該路徑。
如果運行項目的設(shè)備上的 GPU 不支持所選的渲染路徑,則 Unity 將自動使用較低保真度的渲染路徑。例如,在無法處理延遲著色的 GPU 上,Unity 使用前向渲染。
采用前向渲染方式渲染實時光源會非常消耗資源。為了抵消此成本,可以選擇 Unity 在任何一個時間應(yīng)該為每個像素渲染的光源數(shù)量。Unity 會以較低保真度渲染場景中的其余光源:每個頂點或每個對象。
如果項目沒有使用大量實時光源,或者光照保真度對項目而言不重要,則此渲染路徑可能是這個項目的不錯選擇。
延遲著色需要 GPU 支持,并且有一些局限性。這種著色方式不支持半透明對象(Unity 使用前向渲染來渲染這些對象)、正交投影(Unity 對這些攝像機使用前向渲染)或硬件抗鋸齒(但可以使用后期處理效果來獲得類似結(jié)果)。延遲著色對剔除遮罩的支持有限,并會將 Renderer.receiveShadows 標(biāo)志始終視為 true。
如果項目具有大量的實時光源并需要高級別的光照保真度,而目標(biāo)硬件支持延遲著色,那么此渲染路徑對于該項目而言可能是一個不錯的選擇。
渲染路徑(Rendering Path)決定光照如何應(yīng)用到UnityShader中。為了獲取場景中的光源數(shù)據(jù),需要為每個Pass指定其渲染路徑。5.0以后的版本中,Unity支持前向渲染(Forward Renddering Path)和 延遲渲染(Deferred Rendering Path)。系統(tǒng)默認(rèn)情況下選擇的是前向渲染路徑,可以更改,同時若想使用多個渲染路徑,可以在不同的攝像機中調(diào)節(jié) Rendering Path選項。
通過在每個Pass中使用標(biāo)簽來指定Pass使用的渲染路徑,即使用 LightMode標(biāo)簽實現(xiàn)。不同類型的渲染路徑可能包含多種標(biāo)簽設(shè)置。九游娛樂平臺九游娛樂平臺