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!

posted @ 2020-08-15 17:42  天山鸟  阅读(8222)  评论(0编辑  收藏  举报