天天看點

Unity 輕量級渲染管線LWRP/URP詳解

Unity 可程式設計渲染管線, LWRP輕量級渲染管線(Light Weight Render Pipeline)出來有一段時間了, 今天寫一遍文章,詳細的介紹一下可程式設計渲染管線與LWRP輕量級渲染管線相關内容,幫助大家搞懂這些概念,并建立起一個學習可程式設計渲染管線/輕量級渲染管線的思維。整個文章我将會分成4個部分來個大家講解:

   (1): 什麼是渲染管線與向前渲染;

   (2): 什麼是可程式設計渲染管線;

   (3): 輕量級渲染管線與它的基本使用;

   (4): 輕量級渲染管線Shader 模闆結構;

每個Unity版本,實作的輕量級渲染管線LWRP的代碼可能都不一樣,但是思路原理基本都差不多。

1: 什麼是渲染管線與向前渲染

   我本人非常反對高大上的概念包裝,唯獨遊戲中的"渲染"是例外之一。通俗點說渲染就是烘托出相應的環境(光照,陰影,遮擋,反射,折射等),把物體在特定的環境中繪制出來。Unity引擎裡把引擎中完成整個遊戲場景,人物, 環境,光照等遊戲畫面繪制相關,最終把畫面繪制到螢幕上的整套邏輯與相關代碼(普通代碼與Shader代碼)稱為渲染管線。

  Unity引擎的渲染管線主要分為"渲染核心庫"與"渲染政策"兩個部分, “渲染核心庫”是Unity把基于OpenGL/DirectX把渲染相關的接口函數封裝成API,這部分Unity引擎寫好後作為核心的API渲染庫。”渲染政策”指的是Unity引擎繪制整個遊戲場景的時候,如何處理多相機,多光源,陰影投射,物體繪制,霧,自發光等。這個就叫做渲染政策,渲染管線基于一種渲染政策,調用渲染核心庫中的API,把整個遊戲場景繪制出來。

  早期的Unity引擎,把整個渲染管線都内置在引擎裡面,沒有開放給開發者,隻有少數的一些大廠,獲得了Unity引擎源碼授權,能修改和定制裡面的渲染管線相關代碼。Unity内置的渲染管線有: 向前渲染,延時渲染等,目前這兩種用的比較多。Unity引擎預設使用"向前渲染"。接下來我說一下向前渲染管線中的一個渲染政策,為了後面對比輕量級渲染管線做好鋪墊。向前渲染管線可以處理任意多的光源,處理多光源的時候,每個重要光源,都會調用一次Shader裡面的Pass來完成渲染,有幾個重要光源就會渲染幾次,這樣大大降低了多光源時候的繪制效率。是以之前我們很多手機遊戲上面都用靜态光照來渲染場景,獲得逼真的光照效果,因為向前渲染管線多光源的實時計算開銷實在太大。靜态光照有一個問題就是無法獲得實時光照的效果。

2: 什麼是可程式設計渲染管線

  前面個講解了渲染管線與内置的先前渲染管線,我們會發現内置的渲染管線的政策有時候不滿足我們的要求,比如我們需要實時光照,又需要好的性能,那麼向前渲染每個光照都走一次Pass顯然不合适,做手機遊戲,可能隻要4個光源就可以了,不用支援任意多的光源,随着unity可以開發越來越多的遊戲平台,不同平台,不同類型的遊戲越來越需要能修改渲染管線相關的政策,到達好的效果,同時有好的性能。Unity新版本推出了可程式設計渲染管線,把渲染管線裡面的渲染API核心庫開放給開發者,允許開發者自己定制渲染政策。Unity引擎提供了一整套可以定制渲染管線的機制,是以叫做可程式設計渲染管線SRP(Scriptable Render Pipeline)。

3: 輕量級渲染管線與它的基本使用

  内置的渲染管線是針對通用情況,比如支援任意數目的光源等,是以很多政策并不是特定的環境下,針對特定應用場景而得到的最佳的政策,現在手機遊戲非常的廣泛,還有很多其它的遊戲平台,需要好的渲染效果的同時,需要一個好的性能。比如我就希望有多光源的實時光照,我的角色到了光源附近能渲染出光的效果出來,而不是使用靜态光照那樣。同時我們又不需要任意多的光源,隻要限定一個光源數目即可,比如4個。這樣就可以通過定制渲染管線,提升性能,比如我們最多支援4個光源,我把所有光源的計算一起放到一個Pass裡面,這樣提升性能的同時,又獲得實時的光照,雖然對光源的數目做了一些限制(輕量化),卻獲得了效果和性能的一個靈活的平衡。Unity 針對手遊等應用領域,開發了輕量級渲染管線(LWRP),後來基于輕量級渲染管線又衍生出來另外一個渲染管線Universal Render Pipeline(URP,這邊文章我們用的是URP的代碼)。

  渲染管線的渲染政策被定制了,渲染的時候需要Shader來配合最終繪制物體出來,是以不同的渲染管線Shader會不一樣,我們之前學習的Shader開發都是針對向前渲染管線的,比如輕量級渲染管線所有光照計算都在一個Pass,那麼之前向前渲染的Shader肯定就不能直接使用了。是以當我們定制了新的渲染管線以後,還要基于新的渲染管線的政策重新開發一個Shader包(PBR Shader, 粒子, 霧,天空盒等),這個Shader包能滿足大部分的3D遊戲開發的需求,同時我們也可以基于新的渲染管線的政策來開發自己的Shader。

   總結一下定制渲染管線的主要的3個點:

      (1) 渲染核心功能的API,由引擎開放給開發者調用;

      (2) 定制渲染政策,開發者根據自己遊戲的情況來定制自己的渲染管線,達到最好性能;

    (3) 基于渲染管線的渲染政策,開發出對應的Shader包;

完全從頭到尾定制一個渲染管線并不容易,幸運的是Unity引擎為我們做好了輕量級的渲染管線,滿足我們做手機遊戲的絕大部分的需求。我們隻要使用就可以了,如何使用輕量級渲染管線,這裡我們已URP為例:

    (1) 安裝URP的相關的Unity Package, 不同的Unity的版本可能URP的代碼版本不一樣。

(2) 使用URP渲染管線來代替内置的渲染管線。先建立一個渲染管線的Asset檔案,配置好相關資料,建立成功後,在Grpahics下面的Scriptable Render Pipeline選擇這個Asset檔案,切換渲染管線成功。系統會根據Asset檔案的描述來建立出渲染管線出來。如圖:

Unity 輕量級渲染管線LWRP/URP詳解

   (3) 建立角色,場景,建立材質的時候,使用渲染URP渲染管線相關的Shader;

   4: 輕量級渲染管線Shader 模闆結構

   Unity可程式設計渲染管線(包括輕量級渲染管線)的Shader開發仍然使用的是ShaderLab的文法結構,開發語言和普通的Shader開發不一樣,使用的是HLSL程式設計語言。同時有些渲染管線還支援Shader Graphic開發。作為程式員,我個人還是建議自己手寫代碼,比起生成的Shader的代碼,手寫代碼能減少備援,更高效。我們打開URP渲染管線裡面 PBR Shader如下圖:

Unity 輕量級渲染管線LWRP/URP詳解

仍然是基于ShaderLab, 和普通的Shader結構,沒有差別。

 我們來看幾個重要的Pass, 體會一下和向前渲染管線的不同。先來看主要的繪制Pass,處理光照計算的,正如紅線标注的一樣,所有的光源在一個Pass裡面計算完成。

Unity 輕量級渲染管線LWRP/URP詳解

看下陰影投射的Pass:

Unity 輕量級渲染管線LWRP/URP詳解

 看下HLSL代碼,和Cg差不多,是以學習的時候不用由心裡負擔, 打開LitForwardPass.hlsl,這個檔案就是URP裡面PBR Shader具體實作的代碼。截圖如下,資料結構這些和Cg沒有太大的差别,如圖:

Unity 輕量級渲染管線LWRP/URP詳解

 由于篇幅有限,沒有辦法把Shader詳細代碼的講解一遍,為此我還提供了本文對應的代碼與視訊講解(裡面詳細講解了Shader結構),視訊教程: unity輕量級渲染管線LWRP核心解密  ,源碼素材unity學習交流小組 備注“csdn渲染管線” URP渲染管線效果截圖如下:

Unity 輕量級渲染管線LWRP/URP詳解

繼續閱讀