Unity LWRP vs HDRP

Unity SRP相关的文章其实Unite 2019结束就想写了,无奈Unity之前的版本存在bug,在双显卡的机器上用renderdoc会崩溃,直到2019.1.3f1版本才修复了这个问题。估计LWRP和HDRP的相关的结束文章和代码分析也看的差不多了,所以本文另辟蹊径,从画面调试入手,分享Unity LWRP和HDRP的不同,也希望借此给大家一个分析别人游戏画面的思路,还有画面出现问题时该如何定位问题的方法。本文比较基础,对于适合没有图形调试经验但想学习图形调试方法的同学观看。
本文就是用Unity SRP的默认场景了,更复杂的场景其实也一样,毕竟是同一个render path


两张图分别是LWRP和HDRP的,不知道大家能不能肉眼分出来。
上面的是LWRP,下面的是HDRP。两者乍一看其实去吧不是特别大,特别是材质上,毕竟都是PBR材质。两者的肉眼可见的毕竟明显的区别其实也不算多,也就是两者色调存在差异(观察天空盒可以比较明显的看出),探照灯(两者光强也存在一定差别,不过LWRP仔细看可以感觉没什么衰减,HDRP和自然界的光则比较像,实际参数LWRP就用不知物理含义的强度,HDRP则用了物理单位流明)
靠肉眼区分还是太难了,所以,还是掏出renderdoc,看管线吧


这下子应该比较直观了,HDRP的render path长度是LWRP的几倍,而且对渲染有一定了解的同学一定也看出来了,LWRP是标准的forward rendering,而HDRP则是tile based hybrid deferred/cluster forward rendering,对3A游戏有些了解的对这个词一定不陌生。
LWRP分析
LWRP比较短,所以分析的全一些
LWRP的第一步,是渲染main shadowmap

shadowmap一般使用了一张2k分辨率R16_TYPELESS格式的贴图,没有使用常见的深度贴图(d24c8)格式,画了四次,因为使用了CSM。之前Set render target的时候
第二步是Additional shadows

这个过程中每个可投影的光源都会生成自己的shadow map,场景中只有一个Spotlight,所以绘制了一次,而且可以看见,次重要的光源使用1k分辨率的阴影贴图,没有开启CSM
紧接着就是第三步Z prepass

做一次z prepass类似于earlyZ,建设overdraww
第四步,resolve shadows

resolve shadowmap,可以看到这个过程中贴图的格式已经变成了R8,其实还能看到贴图开启了MSAA x4,已经可以断定LWRP默认开启MSAA x4抗锯齿
接下来终于到了重头戏,Render Opaques

在这个过程中,所有不透明的物体依次渲染,绝大部分场景都是最重要的render pass
紧接着是渲染Skybox

Unity LWRP并没有把skybox放在opaque里,因为z perpass也没有处理skybox
Opaque的物体处理完了就该处理Transparent

这个场景半透明物体很少,也基本看不见,一般的话要在半透明这个pass中绘制水,玻璃这些半透明物体,以及粒子特效等使用alphablend材质的物体
最后渲染一些后期效果

LWRP默认场景基本没有什么后期处理,就有HDR tonemapping和Bloom,这两个后期效果是LWRP内置的,其他的post processing需要额外配置
HDRP分析
LWRP分析的比较全面,HDRP就会稍微快一点了
ClearBuffers

有些同学可能不太明白为什么一大推clear还要单独一个render pass,个人猜测这个和PS4有关系,PS4的GNM的clear的效率并不算高,在4K屏上尤其明显,4k屏幕上GNM clear一次耗时可能达到2ms,因此在PS4上普遍采用fastclear,用compute shader来clear
z prepass

和LWRP一样,有个z prepass防止overdraw,decal也要求必须有z prepass
DBuffer

接下来的两个pass,DBufferRender以及DBuffer Normal,就是Deferred Buffer Decal,在DBufferRender过程中使用computer shader来计算Decal,所以还需要DBuffer Normal这个过程,通过绘制一个全屏三角形的方式将DBuffer绘制。曾经全屏特效之类的喜欢用2个三角形占满屏幕,因为像素舍弃少,现在Screen space处理更优先使用全屏三角形,可以减少一个三角形光栅化的损耗。
GBuffer

标准的延迟渲染,没什么好说的
接下来的步骤和为以后的抗锯齿和AO做准备

TAA,SMAA之类和时域有关的抗锯齿技术需要motion vector
阴影贴图

HDRP阴影贴图策略和LWRP相近,但shader要更复杂
紧接着几个pass进行光照计算

基于体的光照计算,全部使用compute shader,对延迟渲染有所了解的同学应该也比较熟悉了
接着就是最重要的pass了——Tile based deferred lighting pass

基于tile的延迟着色,充分减少GPU bandwidth压力,使用compute shader做的。如果不用tile可以使用正常延迟着色的方式,直接一个像素着色
Forward Opaque和Forward Opaque Emissive并没有使用

我这里渲染走了延迟管线,所以Forward opaque是空的。如果使用前向管线,会在这里绘制不透明物体,看Tag可以知道Forward path也是tile based,说明是F+/CFR
次表面散射

这个场景中并没有SSS材质,所以这个pass也是空的
接下来绘制天空

天空绘制的过程中,在LWRP的skybox的基础上,多了一次大气散射的pass
半透明Z prepass

这个步骤可以进行alpha clipping,作用类似alpha test,本例中为空
Forward PreRefraction

如果使用了SSR会用到,本demo中为空
计算各个mip的高斯模糊

很多后期特效依赖高斯模糊,也可以看到高斯也是使用compute shader计算
渲染半透明物体

这个过程和LWRP相近,但是shader要更复杂
又经历一个Gaussian之后,来到Distortion

这个demo中并没有使用扭曲变形特效,因此并看不出来
接下来是post processing

HDRP的默认后期比LWRP复杂过了,动态曝光调整,TAA抗锯齿,Bloom,Color grading,所有过程都是compute shader,所以需要一个final pass,绘制一个全屏三角形来应用
保存当前帧Depth

在最后保持当前帧的Depth
小结
以上就是Unity LWRP和HDRP的渲染分析,希望对大家有所帮助。