日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

走进LWRP(Universal RP)的世界

發布時間:2023/12/13 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 走进LWRP(Universal RP)的世界 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

走進LWRP(Universal RP)的世界?

原文:https://connect.unity.com/p/zou-jin-lwrp-universal-rp-de-shi-jie

LWRP自Unity2018發布以來,進入大家視野已經有一段時間了,不過對于廣大Unity開發者來說,依然相對比較陌生,原因有幾個,一是一直以來LWRP都處于預覽狀態,使用中會遇到一些bug,所以也就止于嘗試。第二個原因就是LWRP的升級跨度太大,基本所有的shader都需要重寫,所有的材質球都得重新調整,這對于已經開始進入Production 階段的項目來說是不可接受的。

最近有幸在項目中使用LWRP,經過好幾個月的使用,回過來看發現目前不少用戶對于LWRP的認識與實際會有不少出入,加之目前關于LWRP的分享大多僅僅是對于其Shader和材質球用法的教程,很少有從原理上介紹LWRP的文章。因此想借著這篇文章,跟大家分享一下這幾個月使用的心得,和踩過的坑。

?

從LWRP到Universal RP

為什么我要在最開頭說這個話題呢,原因是LWRP這個名字即將退出歷史的舞臺,從2019.3開始,LWRP將會以Universal RP的名字跟大家見面。

當然,最根本的原因是LWRP這個名字給使用者帶來了不少誤導和困擾,這也是Unity官方要對管線進行重命名的原因。LW是輕量級的縮寫,大家聽到這個名字,以及Unity最初對這個管線的宣傳,都給大家帶來了這個管線是專為移動游戲簡化并且高度優化的一個管線。換句話說,我們大家都以為,只要換了LWRP,媽媽再也不用擔心做出來的手游卡了。

?

費盡千辛萬苦,將測試場景從內置管線轉換成LWRP之后,我迫不及待的跑了一波性能測試,測試結果emmmmm…

?

?

無論在簡單還是復雜的場景里,最終的渲染耗時和幀率,并沒有發現有什么肉眼可見的性能提升,仿佛之前轉換管線是自己想象出來的,其實并沒有切換管線。

然而這肯定是不可能的,事實上其實是我并沒有搞清楚LWRP的設計初衷和他的優劣勢,于是痛定思痛,我決定從圖形學開始補習,并把LWRP的原理摸透

?

Universal RP的優勢

之前有講到Unity已經正式將LWRP的名稱變更為Universal RP——即通用渲染管線,并將正式接過內置管線的大旗,成為新一代Unity的兼容所有平臺的通用渲染管線。

大家肯定都會跟我有一樣的疑惑,內置管線不是本來就跨平臺好好的么,Universal RP也沒看出來性能上有什么特別的優勢,干嘛放著好好的又穩定的內置管線不用,要跑來折騰什么URP。其實這個問題的關鍵在于,我們之前的打開方式不對。

?

URP在性能上的優勢

說到性能優勢,那首先我們就必須得弄清楚,到底在哪種情況下,URP的哪一方面會有性能優勢。要對比性能那就首先要比較一下,URP跟內置管線到底在渲染上有什么區別。

1、渲染路徑的差別

其中,最大的一點區別是,URP是單Pass前向渲染管線,而內置管線是多Pass前向渲染管線和延遲渲染管線

URP沒有延遲渲染,因此我們只對比前向渲染這一項(其實手游也基本只會用前向渲染,延遲渲染的G-Buffer所需要的帶寬帶來的開銷太大)。

所謂的前向渲染,就是在渲染物體受點光光照的時候,分別對每個點光對該物體產生的影響進行計算,最后將所有光的渲染結果相加得到最終物體的顏色。內置管線的做法是,用多個pass來渲染光照,第一個pass只渲染主光源,然后多出來的光每個光用一個pass單獨渲染。這也是為什么我們在做手游的時候很少會用點光源。因為對于內置管線來說,每多一盞光,整個場景的drawcall就會翻倍,這個性能開銷基本是無法接受的。

URP的做法則是,在一個pass當中,對這個物體受到的所有光源通過一個for循環一次性計算。這么做的好處有:

  • 一個物體的光照可以在一次DrawCall中計算完畢

  • 省去了多個Pass的上下文切換以及光柵化等開銷

  • 但是這么做的壞處也很明顯:

  • 只支持1盞直光

  • 單個物體最多支持4盞點光

  • 單個相機最多支持16盞燈光

  • 因此,有了URP之后,只要控制好點光的范圍,我們在手游里面也可以做多點光照明了,例如釋放一個火球照亮周圍物件,這在內置管線里基本是可以放棄的功能(或者用其他作假的方式模擬)

    2、GrabPass

    還有一個內置管線中,很難運用到手游中的技術,那就是GrabPass

    這個技術通常會用來制作空氣擾動或者刀光等特效帶來的折射效果,在內置管線中如果使用這個功能,則會在每個用到這個Shader的地方對屏幕緩沖區進行一次抓取操作, 這個操作會大幅消耗GPU的帶寬。 在移動設備上帶寬是非常有限的資源,因此這個效果在手機上幾乎是沒法使用的

    在URP中,可以在渲染管線的配置文件中,開啟Opaque Texture,這張圖是管線在完成不透明物體渲染后,將屏幕緩沖區中(也可能是相機的ColorRT)的顏色信息抓取出來保存到一張單獨的RT當中,然后在特效中就可以直接拿這張圖去進行扭曲和擾動計算。

    ?

    ?

    這么做的好處就是可以將抓取操作的次數恒定下來,不會因為同屏有多少個需要擾動的對象而額外增加開銷。當然壞處也比較明顯,那就是沒辦法對不透明物體進行擾動操作了,也就是說只能對場景物件而沒法對特效進行擾動。

    而且Unity非常貼心的在URP的粒子特效Shader當中直接內置了擾動的效果,通過勾選框就能開啟了

    3、SRP Batcher

    在所有SRP管線中(URP和HDRP或者你自己的自定義管線),都可以受益于SRP Batcher,這個功能可以將沒有進行靜態合并,也沒法通過Instancing渲染的使用相同Shader的物體,通過CBuffer去保存每個物體材質球的參數,進而在不進行SetPassCall的情況下完成繪制。這個功能的效果是,可以大幅降低相同DrawCall情況下單個DrawCall的開銷,當這個功能開啟的時候,你會發現,也許你的場景有500個DrawCall,但實際上SetPassCall只有不到100,在相同情況下的渲染性能是要高于內置管線不少的。不過Shader要支持SRP Batcher還是有些條件的,詳細的大家去參考SRP Batcher的文檔吧

    ?

    URP在擴展性上的優勢

    Unity提出SRP,其中一個最大的初衷就是提高渲染管線的靈活性,給使用者提供最大的自定義空間來滿足各個項目的需求。要想一個渲染管線滿足所有類型項目的需求,這根本就是不可能的,這必然會造成對性能或者功能上的妥協。

    因此URP自然而然的具備了非常強大的可擴展性,其大多數功能都是完全模塊化的,可以自由搭配組合,而且對她進行擴展大多數情況下是不需要修改URP本身源碼的!

    1、RenderFeature/RenderObject

    這個功能是LWRP6.x之后加入的新功能,其中RenderObject是RenderFeature的一個默認實現,可以讓大家在不寫一行代碼的情況下對渲染管線進行擴展。

    為了使用RenderObject,我們首先需要建立一個新的前向渲染器的配置文件

    ?

    在項目文件夾中右鍵創建,找到ForwardRenderer這個選項

    ?

    第二步是在剛創建的前向渲染器配置中添加一個新的RenderObject

    然后我們就可以看見,我們可以指定一個Layer,然后對這一層的物件使用指定的材質球再在某個特定的時間點(比如渲染完不透明物體后)再進行一次統一的繪制。

    這個功能能用來做什么呢? 比如主角的遮擋透明,在內置管線中我們只能用2個Pass來做這個事情,而且因為被遮擋時的顯示是半透,所以需要嚴格控制渲染順序不然就會在不少情況穿幫,在內置管線中可能會需要手動修改一系列shader的renderqueue來保證最終的顯示正確,非常麻煩。 但是在URP中,利用RenderObject就能非常輕松愉快的實現這個功能。

    Unity還提供了不少利用RenderObject實現的效果的例子,大家可以移步Github:https://github.com/Unity-Technologies/LWRP-CustomRendererExamples

    那RenderFeature又是什么呢? RenderFeature提供了比RenderObject更低一級的自定義,用戶通過繼承RenderFeature,可以通過代碼手動在自己需要的地方加入自定義Pass,去做自己想做的事情,寫完Feature和Pass之后就能跟RenderObject一樣,在渲染器設置里通過加號添加上去了。由于使用RenderFeature完全看項目需求,因此在這里就不詳細展開了

    2、ScriptableRenderer

    URP還支持你對ScriptableRenderer進行繼承,從而實現一個完全自己的Renderer(自帶的ForwardRenderer就是一個實現),因此如果你足夠強,完全可以自己寫個延時渲染器出來,最棒的是,他已經實現的Pass可以隨便抓來用,避免去寫一些重復的東西。因此如果大家對管線中有任何不爽的地方或者覺得沒必要的地方,大可自由裁切和擴展,自己的項目需要啥咱就用啥,不需要啥就砍啥,主動權完全抓在自己手里!

    ?

    總結

    現在回過頭看最開始的性能試驗,其實并不是因為LWRP沒用,而是我當時的測試場景并沒有使用到能帶來提升的功能(例如點光,扭曲等),這些效果其實在默認管線時期都是壓根不會去想用的效果因為根本跑不動。希望大家在看了這篇文章后,能對新的管線有哪些優勢以及適合用在哪些地方有個更深入的了解,然后再根據大家的項目需求進行取舍。這也是為什么我最初說LWRP這個名字給大家帶來了很多誤解和困惑,因為LWRP性能好,并不是因為他輕量,而是因為他實現就不一樣,他選擇了一條可伸縮性和適配性更強的實現方式,因此新名字Universal RP,比LWRP能更好的說明他的目的和作用。

    ?

    使用中遇到的坑

    ?

    多相機疊加

    這應該是使用URP過程中遇到的最大的坑,多相機疊加對于UI來說至關重要,不支持這個也就相當于不支持在UI上放3D模型和特效,不支持這個基本上對于國內的用戶來說就相當于沒法用了

    好在Unity官方已經確認即將加入多相機疊加功能,并在2019.3中正式實現。在等待19.3的這段時間,跟大家分享一個強制開啟多相機疊加的方法,以方便大家提前入坑。 其實方法簡單到只需要注釋3行代碼!

    打開ScriptableRenderer.cs(適用用LWRP6.7以上,也許以下也行,需要大家自己看),找到GetCameraClearFlag這個方法,按照下面的方法注釋掉對應的3行代碼

    ?

    注釋完上面的3行代碼后,只需要確保第二個相機的Background Type為Don't Care,并且將Opaque Texture和Depth Texture設置為Off,然后就能開心的使用UGUI的Screen Space-Camera了。 不過上面的修改只能保證Editor和PC平臺下的顯示正常,手機上的支持需要大家等Unity官方的新版本,或者也可以嘗試自行修改LWRP的源碼,應該也能改好

    ?

    版本升級帶來的重構

    LWRP在升級過程中發生了2次大幅重構,一次是5.x過后將原本的_MainTex等變量名修改為了_BaseMap,第二次是將LWRP更名為UniversalRP。

    最痛苦的是第一次更名,直接導致我們很多使用自定義shader的材質球報廢…… 主貼圖都找不到了,雖然Unity提供了升級工具,但是只對使用內置Shader的材質球起效……

    第二次更名帶來的影響就小不少了,只是命名空間變更,Unity也提供了升級工具,理論上不會出現特別大的問題,但是自己修改過的東西難免還是得手動處理下

    ?

    TLDR;版

    LWRP/URP是個非常值得大家嘗試的管線,目前的穩定性也已經足夠用于商業項目,他所帶來的擴展性絕對是用過就會愛上的。充分了解LWRP的特性之后,相信大家能更進一步提升項目的表現力和性能

    總結

    以上是生活随笔為你收集整理的走进LWRP(Universal RP)的世界的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。