1 Sriptable Render Pileline
1.1 主要把渲染管線拆分成二層:
- 一層是比較底層的渲染API那層,像OpenGL,D3D等相關的都封裝起來。
- 另一層是渲染管線比較上層的描述,上層代碼使用C#來編寫。在C#這層不需要關注底層在不同平台上渲染API的差別,也不需要關注具體如何做一個Draw Call。
1.2 特征
官方基於SRP提供了二套模板:一個是LWRP(輕量級渲染管線,后改名URP),一個是HDRP(高清晰渲染管線)。
1.3 建議:
可以不改源碼實現,就盡量不改源碼,因為改了源碼后,升級會很麻煩
1.4 未來
(移動游戲未來:AAA級,PBR,超大世界,各種特效,后處理...)
2 LWRP
2.1 優缺點
優點
- Scriptable Render Pass
- SRP Batcher合批
- Custom Render Pass
缺點
- Shadow Mask的功能, Unity 2019.3提供
- 延遲渲染Deferred Rendering, Unity 2019.3提供
2.2 Bilibili-LWRP介紹
1)流程
以下是傳統的BuiltIn渲染,LWRP是在綠點插入繪制命令(CommandBuff)
2)特征
- 新的Shader庫 -- Core和Lightweight RP庫 , 更小的‘chunk’
- 兼容性 -- Unlit Built-In Shader 兼容, 沒有提供Surface Shaders
- ShaderGraph -- 可視化編輯工具
3)注意
- Lwrp PBR shader模板
- 如需對默認Shader Keywords刪除,應管線設置中取消掉對應設置,Keywords就會在構建時候Strip掉
- ..Core.hlsl包含有用變量和功能(類似UnityCG.cginc)
- 如果聲明屬性為UnityPerMaterial,屬性會保存於CBUFFEER中,SRP就可以在幀之間緩存材質屬性。
簡單到復雜定制:
- LWRP + shader graph
- LWRP + Custom Render Passes
- 編寫自己的Custom Render Passes
- 實現自己的Renderer
- Build your own SRP from scratch
實操教程(以下是國外教程的譯文)
3 Universal Render Pipeline
3.1 介紹與使用
1)介紹
通用渲染管線Universal RP
LWRP是URP之前的名稱,兩者基本沒有區別,URP相對LWRP的變化主要是把PostProcessing集成到內部了。
使用
- 直接new URP工程
- 或者現有工程安裝Univeral RP包。
1)在Other Settings > Color Space 選擇Linear
2)Create > Render >Pipiline Asset
3)ProjectSettings > Graphisc
URP前向渲染,光照優化的原因
URP的單Pass Forward Renderering,會將光源一次性傳入Forward Pass,但由於單Pass能夠傳的數據有限,現在最多支持一個直線光外加4個其他光源。
3.1 后處理相關
1
General
- Depth Texture : 獲取屬於URP的深度texture,也可在individual cameras 的inspector覆蓋。
Quality
- HDR :讓光的強度范圍更大,更貼近真實。而不失細節。低硬件設備要禁用。
- MSAA :抗鋸齒
- RenderScale :只對game rendering 生效。 UI Rendering is left at the native resolution for the device.
3.2 URP 不支持的效果:
- 基於方向運動的效果包括運動模糊
- Screen Space Reflections (SSR)
- 默認 基於計算的效果,比如:自動曝光。 只有設備硬件支持的時候才可以用,否則運行時unity會禁用掉
3.3 移動設備使用URP將會帶來不小消耗,如果用推薦
Post-processing effects can take up a lot of frame time. If you’re using UniversalRP for mobile devices, these effects are the most “mobile-friendly” in the PPv2 stack:
- Anti-aliasing (FXAA - Fast mode)
- Bloom (Fast mode)
- Chromatic Aberration (Fast mode) --色差
- Color Grading (with LDR)
- Lens Distortion
- Vignette --暈映
3.4 URP 優勢:
1 適合移動平台的PBR渲染管線
2 非入侵式修改即可實現管線自定義
3 有全部C#源碼,渲染過程基本能全掌控
4 性能表現更好 (通過RT自定義LoadStore操作、SRP Batcher)
1)URP是一個單Pass的前向渲染管線,所有的動態光照是在一個Pass里面完成計算的
2)URP采用了單Pass的Color Texture去替代GrabPass。通過一次抓取完成所需操作
3)通過RT自定義LoadStore操作,進一步減少帶寬。
4)根據實際情況去掉一些不必要的Blit操作。
5)SRP Batcher (SRP Batcher的原理是通過降低SetPassCall的數量來打造性能提升)
(ILRuntime作者)林若峰以“Unity2019新特性在次時代手游《黑暗之潮》中的應用經驗及技術分享”
Bilibili視頻
4 SRP Batcher
干什么?
基於Shader的批處理
SRP Batcher不是減少DrawCalls. 減少 GPU setup (cost between DrawCalls)
原理
SRP Batcher 是一個低級渲染循環,它使得Material 數據長久在GPU內存里。
如果Material內容不變,SRP Batcher就不需要設置並上傳buffer到GPU里。
相反( 如果Material內容有變),SRP Batcher 使用專用的代碼路徑去快速更新Unity Engine屬性到一個大型的GPU bufer里。
兼容性
官方:
- The object must be in a mesh.
- 使用的shader要兼容SRP Batcher.
- 所有Lit and Unlit Shaders適用(HDRP、LWRP中的)
- 不支持粒子或者skinned mesh.
- 不支持使用了Material Property Blocks
Shader 如何兼容with SRP(Inspector可查是否兼容):
- built-in 的屬性要聲明在一個CBUFFER named “UnityPerDraw”. For example, unity_ObjectToWorld, or unity_SHAr.
- 所有材質屬性要聲明在一個CBUFFER named “UnityPerMaterial”.
You can see the compatibility status of a Shader in the Inspector panel. This compatibility section is only displayed if your Project is SRP based.
使用:CBUFFER_START(UnityPerMaterial)聲明
//錯誤
Properties
{
_Color1 ("Color 1", Color) = (1,1,1,1)
_Color2 ("Color 2", Color) = (1,1,1,1)
}
float4 _Color1;
float4 _Color2;
//正確
CBUFFER_START(UnityPerMaterial)
float4 _Color1;
float4 _Color2;
CBUFFER_END
3 Shader Graph
shader Graph 入門:
Shader Graph: Multiply - 2019.3