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