(二十七)unity shader之——————基本的渲染概念

一、逐頂點計算和逐像素計算

1.1逐頂點計算

在vertex函數中進行的計算就叫逐頂點計算,該計算量只和模型的頂點數量或面的數量有關,而和其他因素(如模型在屏幕上的大小)無關。在unity的表面着色器中,逐像素的計算髮生在vertex:vertexfunction所確定的函數中。

1.2逐像素計算

在fragment函數中進行的計算就叫逐像素計算,這個計算量和模型的具體頂點數量以及面數無關,而和物體在屏幕上的大小有關。而3個點確定的面經過柵格化之後,往往會產生成百上千的像素,因此逐像素和逐頂點計算的計算量往往相差數個數量級。逐頂點計算和逐像素計算是着色器計算、渲染優化的重點。

1.3如何在這兩個概念中取捨

儘量把計算移動到vertex函數中,同時使逐像素計算的面在屏幕上儘量小。另外在移動平臺的頂點數不要超過10的6次方。在PC上要限制在10的7次方級別內。

二、繪製調用的意義

2.1繪製調用的概念

繪製調用是CPU爲GPU準備渲染數據並令GPU進行一次渲染的操作。這是系統的一個底層操作,涉及大量的數據生成和前期準備,因此是重量級的。

2.2正確理解繪製調用對開發應用的意義

繪製調用是一個重要指標,具體就是CPU和GPU交互、協同的一個重要指標,或者說是瓶頸。它終究只是CPU和GPU交互效率 一個指標,並不是一切。對於GPU來說,一次繪製調用的消耗還是具體看繪製調用的內容,也就是着色器的具體代碼。

2.3合批的概念和unity爲優化繪製調用所做的工作

通過把數個或數百個簡單的、共用同一材質的物體合併爲一個網格,unity僅使用一個繪製調用就能完成渲染,而不需要數十次或數百次繪製調用。有兩種類型的合批:動態的和靜態的。對於靜態的合批,只有當物體使用同一材質並且物體不受實時陰影影響時,動態合批纔會發生。對於前向渲染路徑,ForwardAdd的通道也不會被合批。對於靜態合批,必須將物體標記爲static類型,但是unity目前會爲每一個合批的幾何體創建一個幾何數據的備份,這意味着需要更多的內存。因此如果應用對內存佔用很敏感,可以考慮禁用靜態合批。

目前unity對網格渲染器和粒子進行了合批,對於蒙皮、布料和拖尾效果並未進行合批。對於蒙皮、布料和拖尾效果未進行合批。對於半透明物體,由於需要從後往前進行渲染,因此也很難進行合批。

2.4優化繪製調用

使用盡量少的材質,這樣unity可以在合批時儘量合併物體的網格,減少Draw Call。當然也可以手動合併小物體的網格。合理地佈局重要的光源,使一個物體儘量少地受逐像素渲染的光源影響。

三、利用渲染隊列的技巧

3.1渲染隊列的概念

渲染隊列是子着色器的標籤爲Queue的值,該值告訴unity使用此材質的物體的渲染優化次序。

3.2設置渲染隊列的技巧

如何利用渲染隊列優化渲染?首先考慮爲場景的主要角色設置一個小一點的渲染隊列,這樣就可以首先渲染主要角色,從而在深度測試時,遮擋掉角色後面那部分,進而減少計算。然後爲那些經常被遮擋的角色和物體設置一個大的渲染隊列,這樣就會在靠後的時候渲染它們,這時很可能在深度測試的時候失敗,從而減少了一部分計算量。最後如果有天空,把它們的渲染隊列設置到最大,這樣就有儘可能大的概率,在深度測試時剔除掉這些點。對於非透明的物體,一個正確的、系統的渲染隊列排序,可以剔除掉很多像素點的渲染。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章