1.1 前言
Unity目前已经支持了将近30个游戏平台,这就意味着内置渲染管线必须同时支持全部平台,平台之间的差别性致使内置管线愈来愈臃肿不堪。引擎每次对特定平台的管线修改都必须考虑其余平台的兼容性(确定会用到各类if else条件,或者宏预编译判断),内置渲染管线没法对开发者提供一些定制化修改接口,普通开发者没法去学习渲染管线,致使大部分开发者对这块知识都很匮乏,不利于我的成长。git
Unity自2018推出SRP(可编程渲染管线),从它诞生那一天起就被贴上了高性能、高拓展性、高定制化的标签,这是具备跨时代意义的。Unity在C++开放出更底层的渲染接口是SRP的根基,继续对外开出C#接口让使用者能够充分定制,这里的使用者也包括引擎开发者,将代码从C++中剥离到PackageManager中不只能够对引擎作一个瘦身,若是出现Bug也不须要从新发布引擎,只须要从新发布URP的Package包便可。另外,移动端和主机芯片从设计上就大相径庭,强行把它们揉在一块儿用一套渲染管线,没法充分兼顾性能与效果。在SRP的加持下Unity推出了面向通用平台的URP渲染管线,和面向主机平台的HDRP高清渲染管线,进一步让开发者对管线进行充分定制与优化。github
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游艇对抗ui
URP提供的渲染效果也没有HDRP多,好比体积光、体积雾、大气散射、光线追踪、次表面散射等目前都没有提供,在新版本URP中已经提供了SSAO和Shadow Mask功能。并且HDRP提供了效果也能够自行移植到URP中来, URP从设计上抛弃了不少内置管线的缺陷,这也致使了一些本来内置管线有的东西却在URP上实现不了,我相信随着版本的迭代,这些都不会是问题。最重要的是URP和HDRP的C#部分代码都是开源的,开发者也能够基于SRP实现一套独有的渲染管线,这样性能与效果就能够达到最佳平衡。url
在正式进入学习以前咱们先来致敬一下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。