URP從原理到應用——基礎篇

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上的插件,大量渲染教程,這些大多都仍是基於內置管線的。優化

loading

URP遊艇對抗ui

URP提供的渲染效果也沒有HDRP多,好比體積光、體積霧、大氣散射、光線追蹤、次表面散射等目前都沒有提供,在新版本URP中已經提供了SSAO和Shadow Mask功能。並且HDRP提供了效果也能夠自行移植到URP中來, URP從設計上拋棄了不少內置管線的缺陷,這也致使了一些本來內置管線有的東西卻在URP上實現不了,我相信隨着版本的迭代,這些都不會是問題。最重要的是URP和HDRP的C#部分代碼都是開源的,開發者也能夠基於SRP實現一套獨有的渲染管線,這樣性能與效果就能夠達到最佳平衡。url

在正式進入學習以前咱們先來致敬一下Unity的首席圖形渲染大佬Phli_lira(費利佩·里拉),他是URP和Shader Graph的做者,我在學習URP的過程當中谷歌搜索問題,每次都能看到他的詳細回答,在論壇裏他和大量開發者交流,解答了不少人心中的疑惑。

loading

費利佩·里拉(圖片來自領英)

大佬本身開源了一套本身基於URP的工程: https://github.com/phi-lira/UniversalShaderExamples

這個例子很是適合初學者學習,它並不像Unity內置的Lit.shader那樣相互關聯了一大堆文件看起來會很是費勁,而是從少到多一點點加的。都是從最基礎基於URP的Shader拓展出來的,包括自發光、陰影、MatCap環境反射、屏幕空間UV、Lit PBR、車漆。

loading

還要感謝另一位大佬,就是From Built-in URP這篇文章的做者,URP在文檔中並無詳細說明着色器在Built-in管線的函數如何1:1替換成URP管線的函數,這篇文章做者寫得很是清楚,在移植管線的時候幫了咱們大忙,不知道爲何這篇文章目前網上已經找不到了(知乎上能找到有人翻譯的文章), 我當時在給組員講URP的時候有保存過一份,恰好在這裏也在分享一份離線的。

loading

2020年11月我在北京UUG上分享了案例《SRP到URP從原理到應用》,惋惜當時沒有錄像,有興趣的小夥伴也能夠前往UWA學堂查看下載相關PDF。

《URP從原理到應用——基礎篇》全文可戳此閱讀

相關文章
相關標籤/搜索