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