Unity-URP、LWRP、SRP


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

實操教程(以下是國外教程的譯文)

Unity SRP系列教程


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

SRP Batcher: Speed up your rendering!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM