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的一些高端效果。
URP的目標平台並不完全是移動設備,而是所有平台。最開始被稱為輕量渲染管線--Light Weight Render Pipeline,簡稱LWRP。很多開發者就會有誤解,LWRP是不是就意味着性能更強勁,其實這個結論不完全正確,甚至使用不當有可能還不如內置渲染管線。
后來Unity將LWRP更名Universal Render Pipeline,簡稱URP。自Unity 2021版本后,內置渲染管線將不再進行維護,將使用URP完全代替它。市場上的開發者要想完全切換URP可能還得一段時間,比如Asset Store上的插件,大量渲染教程,這些大多都還是基於內置管線的。
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的時候有保存過一份,剛好在這里也在分享一份離線的(UWA學堂本小節文末可下載)。
2020年11月我在北京UUG上分享了案例《SRP到URP從原理到應用》,可惜當時沒有錄像,
有興趣的小伙伴也可以前往UWA學堂查看下載相關PDF。