URP从原理到应用——基础篇

1.1 前言

Unity目前已经支持了将近30个游戏平台,这就意味着内置渲染管线必须同时支持所有平台,平台之间的差异性导致内置管线越来越臃肿不堪。引擎每次对特定平台的管线修改都必须考虑其他平台的兼容性(肯定会用到各种if else条件,或者宏预编译判断),内置渲染管线无法对开发者提供一些定制化修改接口,普通开发者无法去学习渲染管线,导致大部分开发者对这块知识都很匮乏,不利于个人成长。

Unity自2018推出SRP(可编程渲染管线),从它诞生那一天起就被贴上了高性能、高拓展性、高定制化的标签,这是具有跨时代意义的。Unity在C++开放出更底层的渲染接口是SRP的根基,继续对外开出C#接口让使用者可以充分定制,这里的使用者也包括引擎开发者,将代码从C++中剥离到PackageManager中不仅可以对引擎做一个瘦身,如果出现Bug也不需要重新发布引擎,只需要重新发布URP的Package包即可。另外,移动端和主机芯片从设计上就截然不同,强行把它们揉在一起用一套渲染管线,无法充分兼顾性能与效果。在SRP的加持下Unity推出了面向通用平台的URP渲染管线,和面向主机平台的HDRP高清渲染管线,进一步让开发者对管线进行充分定制与优化。


1.2 SRP简介

为了让目标平台充分发挥性能与效果,Unity自2018版本提供了SRP全称Scriptable Render Pipeline(可编程渲染管线),Unity将C++调用渲染API (如:OpenGL ES)的接口尽可能做到浅封装并且对外开放C#调用接口,这样就可以编写C#脚本来控制Unity渲染的每一帧。SRP并没有直接提供类似对接OpenGL ES的接口,所以并不能为所欲为,有些东西依然是做不到的。

基于SRP技术,Unity开发了URP(通用渲染管线)和HDRP(高清渲染管线),这样在性能高端的PC主机上可以使用更好的渲染效果。未来在手机上也可以支持HDRP,HDRP上的好效果也可以自行移植到URP,渲染管线是跑在CPU上的而非GPU,GPU硬件也有一套自己的渲染管线,两者是不同的。这两年手游上也有基于GPU Driven的渲染管线裁减技术的案例,有兴趣的朋友可以去互联网上找找。

HDRP的目标是为高端平台,如主机、PC平台提供震撼的视觉效果,高端的效果必然对硬件的算力有一定要求,它同时支持前向渲染和延迟渲染技术,内置了大量3A游戏的渲染效果体积光、体积雾、大气散射、光线追踪、次表面散射和SSAO等,所用到的技术包括Visual Effect Graph特效编辑器、Shader Graph可视化着色器编辑器、Timeline、Cinemachine以及Post Processing Stacks后处理,基本是应有尽有。HDRP未来也会支持移动设备,移动设备也分高端机和低端机,在高端机或VR上也可以使用HDRP的一些高端效果。


Unity官方的数字人异教徒

URP的目标平台并不完全是移动设备,而是所有平台。最开始被称为轻量渲染管线--Light Weight Render Pipeline,简称LWRP。很多开发者就会有误解,LWRP是不是就意味着性能更强劲,其实这个结论不完全正确,甚至使用不当有可能还不如内置渲染管线。

后来Unity将LWRP更名Universal Render Pipeline,简称URP。自Unity 2021版本后,内置渲染管线将不再进行维护,将使用URP完全代替它。市场上的开发者要想完全切换URP可能还得一段时间,比如Asset Store上的插件,大量渲染教程,这些大多都还是基于内置管线的。


URP游艇对抗

URP提供的渲染效果也没有HDRP多,比如体积光、体积雾、大气散射、光线追踪、次表面散射等目前都没有提供,在新版本URP中已经提供了SSAO和Shadow Mask功能。而且HDRP提供了效果也可以自行移植到URP中来, URP从设计上抛弃了很多内置管线的缺陷,这也导致了一些原本内置管线有的东西却在URP上实现不了,我相信随着版本的迭代,这些都不会是问题。最重要的是URP和HDRP的C#部分代码都是开源的,开发者也可以基于SRP实现一套独有的渲染管线,这样性能与效果就可以达到最佳平衡。

在正式进入学习之前我们先来致敬一下Unity的首席图形渲染大佬Phli_lira(费利佩·里拉),他是URP和Shader Graph的作者,我在学习URP的过程中谷歌搜索问题,每次都能看到他的详细回答,在论坛里他和大量开发者交流,解答了很多人心中的疑惑。


费利佩·里拉(图片来自领英)

大佬自己开源了一套自己基于URP的工程:

https://github.com/phi-lira/UniversalShaderExamples

这个例子非常适合初学者学习,它并不像Unity内置的Lit.shader那样相互关联了一大堆文件看起来会非常费劲,而是从少到多一点点加的。都是从最基础基于URP的Shader拓展出来的,包括自发光、阴影、MatCap环境反射、屏幕空间UV、Lit PBR、车漆。

还要感谢另外一位大佬,就是From Built-in URP这篇文章的作者,URP在文档中并没有详细说明着色器在Built-in管线的函数如何1:1替换成URP管线的函数,这篇文章作者写得非常清楚,在移植管线的时候帮了我们大忙,不知道为什么这篇文章目前网上已经找不到了(知乎上能找到有人翻译的文章), 我当时在给组员讲URP的时候有保存过一份,刚好在这里也在分享一份离线的。

2020年11月我在北京UUG上分享了案例《SRP到URP从原理到应用》,可惜当时没有录像,有兴趣的小伙伴也可以前往UWA学堂查看下载相关PDF。

《URP从原理到应用——基础篇》全文可戳此阅读

你可能感兴趣的:(开发原理渲染基础)