前往
大廳
主題

【Unity * Render Pipeline 學習筆記】從0做出自定義Render Pipeline,意外學到partial class

%%鼠 拒收病婿 | 2021-11-20 03:00:06 | 巴幣 1322 | 人氣 688

前言:
最近太忙了,抽出一天來讀自己喜歡的東西。

這篇文章算是再複習一次,筆記有些疑問,希望有興趣的桐學能幫忙解惑


基本的Skybox:

1.創建asset的類別,類似做scriptableObject,可以產生asset檔:

在自定義的RP中,實作介面的Render方法:
Render會在畫面刷新時候呼叫,例如點一下滑鼠或移動畫面物件時。

CameraRenderer是我們自定義的類別:
ScriptableRenderContext :用來安排渲染狀態。

若沒 context.SetupCameraProperties(camera) ,則畫面內容不會套用camera的tramsfrom等資訊。

結果:(因為有SetupCameraProperties,所以才能套用正確的camera旋轉。)


加入Frame  Debug


成功出現在frame debug清單上:
*此為frame debug,若是要出現在profiler清單上:
(此為記錄讀取camera.name的記憶體分配,上圖106B來自取得camera.name 的記憶體分配。)
疑問:為什麼讀取也會有記憶體分配掉?

Cull

為了節省效能,我們只需要渲染畫面上看得到得物件,其他則cull掉。

渲染基本幾何體:

使用ref得好處在於避免函數傳遞參數時需要再copy一份。

*透明物體會被skybox遮擋因為透明物體不會寫進深度buffer,所以他們無法遮蔽身後的物體。所以將不透明跟透明的分開render:


注意不透明體是 front-to-back ,透明體是back-to-front  。因為透明體沒有寫進z-buffer,所以透明體沒辦法用深度做判斷。一般使用物體中心位置為比較依據,從遠到近渲染才能有blend的效果。但物體若太大,則可能造成距離判斷的錯誤,所以建議將大型幾何體拆塊。


支援渲染其他shader類型:

在上面我們用static ShaderTagId unlitShaderTagId = new ShaderTagId("SRPDefaultUnlit"); 指定輸出的shader類型為SRPDefaultUnlit,因此其他類型的材質不會顯示:

渲染不支援的shader tag
上圖shader tagids[]應該已經過時,可以參考其他tagid類型

不支援的材質將會是純黑色的:

用常見的紫色error材質替代:

疑惑:每次new DrawingSettings會不會浪費空間?



Partial Class

將一個類別分拆成許多檔案,典型的使用案例是將自動產生的程式碼與人工撰寫的部分分開。這裡是將editor的部分與實際渲染的部分分開。

此處將CameraRenderer拆成兩個,其中一個專門for editor:
程式碼有點長就不截圖了,值得注意的是像DrawUnsupportedShaders方法現在只存在editor模式下,這樣build會在另一個腳本呼叫時出錯,因此在外宣告方法避免error,類似於抽象方法宣告。

渲染UI

當camera 的render mode是overlay時,UI並非透過我們的RP顯示。

將canvas render mode設成 screen space -camera,就能將UI視為透明幾何體透過指定camera渲染。


screen座標無法顯示UI:



多個相機:

在場景上加上第二個鏡頭,secondary camera。目前有2個相機,但只會顯示最後一個渲染的結果,要結合兩個相機的內容需修改程式碼:
main camera會先渲染,再來是secondary camera,因此若secondary camera的clear flag選skybox或color則會覆蓋掉main camera的內容。應當選depth。


後記:
要準備研究所推甄變得很忙,因為不太想死讀書考試,所以會想拚其他成績當書審資料,不知道有沒有大佬能提供升學經驗談。
送禮物贊助創作者 !
0
留言

創作回應

落雨空空AoiSora
2021-11-20 08:09:44
⊰⊱求出處學術用⊰⊱
2021-11-20 10:41:55
追蹤 創作集

作者相關創作

更多創作