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从原理到利用——根底篇》全文可戳此浏览