Render pipeline觀察日記 ─ Culling, Sorting, and Queue range

Kiloyd
講座隨筆 & 實作觀察日記
4 min readOct 3, 2018

※本文是對Unity SRP學習過程中消化不良的隨筆,主要都聚焦在實際操作和程式碼效果。
Overview:https://blogs.unity3d.com/2018/01/31/srp-overview/
官方測試專案github:https://github.com/stramit/SRPBlog

1. Culling

以camera的視角觀察, ScriptableCullingParameters可以儲存各項用於Culling所需的參數設定,如Mask, Flag等。CullResults則是負責完成Culling後可見的部分,如上面程式碼中的cull。context的型態則為ScriptableRenderContext,負責發出繪圖指令並通知GPU執行,是Custom Render Pipeline中最重要的輸出。

SetupCameraProperties可以決定使用目標camera的View, Projection, Clipping plane做為設定提供給Unity Shader。

CommandBuffer儲存了一系列的渲染指令, ClearRenderTarget(true, false, Color.black)的作用,是清除渲染目標的Depth buffer並將背景顏色設為黑色, context呼叫ExecuteCommandBuffer直接執行該渲染指令,再將cmd這個CommandBuffer的空間釋放出來,接著準備進入Drawing階段。

2. Drawing

Sorting:

DrawRendererSettings儲存了兩個重要的參數:Sorting和ShaderPass,前者決定了渲染物件的先後順序,後者則是決定渲染時要採用哪個Shader。

以上述程式碼為例,是套用名為BasicPass的Shader、採用CommonOpaque的排列方式來繪圖。CommonOpaque指的是一般情況下渲染不透明物體的排列順序,大致上以camera視角為基準,由近到遠,以節省被遮蔽部分的渲染。

CommonOpaque渲染順序

Queue range:

FilterRenderersSettings是針對可視物件再進一步過濾,方便我們進行個別的渲染,例如場景同時有透明與不透明物件,兩者渲染的順序就會有差異(透明物件的渲染是由後往前)。藉由指定Queue Range我們過濾出想要Render的物件,再以該設定(上一part的DrawRendererSettings)進行繪圖,下面的程式碼便是分別渲染透明與不透明物體的情況。

指定不同的Queue Range,分別以不同的Sorting方式來渲染透明與不透明物體

效果不多說,用看的比較快。

不透明物體的渲染順序和透明物體(三顆海灘球)的順序不同

整個順序是:以Opaque過濾Queue Range以獲取不透明物體,再用CommonOpaque的sorting來渲染,之後用一樣的方法以Transparent獲取透明物體並以CommonTransparent渲染。

內容差不多到這裡告一段落,如有任何想法或指正歡迎留言指教!

--

--