[Unity]LWRP和URP

2020/09 07 21:09

一、区别

Unity2018. LWRP -> Unity2019. Universal Render Pipeline
倾向移动平台,也支持所有平台

HDRP 全部基于Compute Shader,基于最新硬件来开发

二、LWRP与BuildIn管线对比

Building情况:
Shading: Multiple Passes
DirectLight: Unlimited
Per-Object: Unlimited
Per-Camera: Unlimited
Batching: Static/Dyanmic
Scriptable Render Pass: Not Supported
Custom Renders: Not Supported
ShadowMask: Supported
Deferred Rendering: Supported
PBR: Supported

LWRP情况:
Shading: Single Pass
DirectLight: 1
Per-Object: 4
Per-Camera: 16
Batching: SRP Batcher/Static/Dynamic
Scriptable Render Pass: Supported
Custom Renders: Supported
ShadowMask: 计划在2019.3中支持
Deferred Rendering: 计划在2019.3中支持
PBR: Supported

三、特性:

BuildIn管线的MultiPassForwardRendering,每一个光都要增加一个Pass,性能差

LWRP中为单PassForwardRednering,动态光放在一个Pass里渲染
支持1平行光和4动态光

LWRP需要导入2个包: CoreRP和Lightweight RP

CoreRP是HDRP和LWRP共用包,可在Packages/CoreRPLibrary中找到,里面没啥营养成分

RenderPipelineAsset中,有一个选项:
OpaqueTexture选项,此为LWRP提供的一个功能,勾上,即可获得一张GrabPass的RenderTeture
用来做水渲染特别好,比Shader中的GrabPass性能更好
在Shader中使用CameraOpaqueTexture即可

主要的渲染管线在LightweightRenderPipeline类中,即迭代所有相机,调用RenderSingleCamera

“过去我们制作射击类游戏,经常要做的一件事情是这把枪用不同的FOV单独渲染。如果枪不进行特殊处理,使用和场景相同的FOV去画的话,画出来会很窄,占屏幕面积很小,很不美观。所以过去制作FPS的游戏经常要单独画枪,它的FOV可能会小一点,这样它占的屏幕空间会更大。过去没有可编程渲染管线SRP,过去在内置渲染管线Pipeline里,我们要用二个相机,一个相机画枪,一个相机画场景,这样可以设置不同的FOV即视角。但是这样的问题是过去Unity的Camera其实很费性能,即使加入一个什么Camera都不做,仍有很大的消耗。因为它会计算相机的剔除,Flatten裁剪之类的计算,所以相机越多性能会越差。我们建议大家尽量不使用多个Camera,能用一个Camera解决就用一个Camera。现在有了可编程渲染管线SRP,我们就可以用一个Camera来解决。”

1、可编程渲染管线里面有很多Render Pass,我们可以添加自己的Render Pass,也可以删除一些Pass,可编程渲染管线就是按顺序执行不同的Render Pass。

2、Render Feature和WaterCausticPass。Render Feature继承自ScriptableRenderFeature。

3、写了Render Feature之后,引擎就会在下拉菜单里增加这个Render Feature的选项,这个Render Feature负责把下面这个Render Pass加到Renderer里面。Render Feature可以在渲染管线的某个时间点增加一个Pass或者多个Pass。

4、WaterCausticsPass这个类继承自ScriptableRenderPass,这个类重要的是要有RenderPassEvent,它里面有Pass执行的时间点,用来控制每个pass的执行顺序。在ScriptableRenderPass里,可以在构造函数里面去指定了Event在什么时间点执行,默认的话Event是在不透明物体之后画,即AfterRenderingOpaque。

5、示例Demo:https://github.com/Unity-Technologies/UniversalRenderingExamples

6、BoatAttack中水的效果就用到了Render Feature,它实现了焦散的效果:
https://github.com/Verasl/BoatAttack

7、使用UIWidgets可以把Unity当做开发App的工具,可以定制刷新频率

8、Shader:LWRP中,必须把Property它加入到Constant Buffer里面,否则变量无效。定义后,即使在外面材质部分调参数也会没有作用。

9、如果想在Assets路径下的Shader内Include Package里面的Shader,按照这个路径去Include:
include “Packages/com.unity.render-pipelines.core/ShaderLibrary/Macros.hlsl”