最近太忙了,抽出一天來讀自己喜歡的東西。這篇文章算是再複習一次,筆記有些疑問,希望有興趣的桐學能幫忙解惑。
基本的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,因此其他類型的材質不會顯示:(see:其他tagid類型)渲染不支援的shader tag不支援的材質將會是純黑色的:用常見的紫色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。
後記:
要準備研究所推甄變得很忙,因為不太想死讀書考試,所以會想拚其他成績當書審資料,不知道有沒有大佬能提供升學經驗談。