1. 程式人生 > >剖析虛幻渲染體系(01)- 綜述和基礎

剖析虛幻渲染體系(01)- 綜述和基礎

[TOC]     # **1.1 虛幻簡介** 虛幻引擎(Unreal Engine,UE)是一款集圖形渲染和開發套件的商業引擎,在歷經數十年的發展和沉澱,於百擎大戰中脫穎而出,成為引領實時渲染領域的全球性的通用商業引擎,廣泛應用於遊戲、設計、模擬、影視、教育、醫學等行業。它出自遊戲公司Epic Games,最初由Tim Sweeney負責,從上世紀90年代中期就開始,已經經歷了20多年,歷經數個大版本迭代。 ## **1.1.1 Unreal Engine 1(1995)** 1995年起由Tim Sweeney帶頭研發,到1998年開發出第一款遊戲Unreal,這是一款第三人稱的射擊遊戲,從此打開了Unreal Engine的通用商業引擎的大門。 作為初代引擎,具備如下特性: * 彩色光照(colored lighting)。 * 有限紋理過濾(a limited form of texture filtering)。 * 碰撞檢測(collision detection)。 * 場景編輯器。 * 軟渲染器(CPU端執行繪製指令,後移到硬體加速的Glide API)。 ![](https://img2020.cnblogs.com/blog/1617944/202010/1617944-20201026110251098-678773550.jpg) *Unreal Engine初代編輯器的介面。* ## **1.1.2 Unreal Engine 2(1998)** 虛幻2代依然由Tim Sweeney帶頭研發,1998年開始研發,2002年完成第二版本的開發,並研發了對應的多人射擊遊戲America‘s Army等數款遊戲。 相比第一代,第二代虛幻的特性主要體現在: * 更加完善的工具鏈。 * 影院級編輯工具鏈。 * 粒子系統。 * 支援DCC骨骼動畫匯出等外掛。 * 基於C++的wxWidgets工具箱。 * 基於Karma physics engine的物理模擬:布偶碰撞、剛體碰撞等。 ![](https://img2020.cnblogs.com/blog/1617944/202010/1617944-20201026110313236-341497274.jpg) *Unreal Engine 2編輯器介面。* ![](https://img2020.cnblogs.com/blog/1617944/202010/1617944-20201026110343762-286809281.jpg) *基於Unreal Engine 2開發的遊戲Killing Floor的畫面。* ## **1.1.3 Unreal Engine 3(2004)** 虛幻3經歷一年半的閉門研發,於2004釋出。這個版本也給行業帶來了諸多新特性,主要有: * 面向物件的設計。 * 資料驅動的指令碼。 * 物理系統。 * 音效系統。 * 全新的動態所見即所得的工具鏈。 * 可程式設計渲染管線。 * 逐畫素的光影計算。 * Gamma校正的HDR渲染器。 * 可破壞的環境。 * 動態軟體模擬。 * 群體角色擬。 * 實時GI解決方案。 ![](https://img2020.cnblogs.com/blog/1617944/202010/1617944-20201026110412272-2017164708.jpg) *Unreal Engine 3編輯器介面。* 虛幻3的遊戲代表作比較多,主要有Gear of War、RobotBlitz、Infinity Blade、Dungeon Defenders、Batman: Arkham City、Aliens: Colonial Marines等等。 ![](https://img2020.cnblogs.com/blog/1617944/202010/1617944-20201026110433640-1104537328.jpg) *Batman: Arkham City的遊戲畫面一覽。* ## **1.1.4 Unreal Engine 4(2008)** Unreal Engine 4早在2008年就釋出了,迄今已經走過了12個年頭。經歷了20多個版本的迭代,引入了無數令人驚豔的特性,包含但不限於: * PBR的渲染管線和配套工具鏈。 * 基於DXR和RTX的實時光線追蹤。 * 藍圖系統。 * 視覺化材質編輯器。 * 延遲渲染管線。 * 移動平臺輕量化渲染管線。 * VR渲染管線。 * Niagara等GPU粒子。 * 更加真實的物理模擬(破壞、碰撞、軟體等)。 * 更加完善的遊戲和影視化生產工具鏈。 * 支援更多主流平臺。 * ...... ![](https://img2020.cnblogs.com/blog/1617944/202010/1617944-20201026110451727-1421317668.png) *UE4 編輯器一覽。* ![](https://img2018.cnblogs.com/blog/1617944/201908/1617944-20190816201456739-1057807975.jpg) *UE4.22實時光追畫面一覽。* 隨著UE4的發展和Epic Games公司策略的變更,最終於2015年做了一個震驚行業的決定:對所有使用者免費,並且開放了原始碼。從此,任何人和機構都可以研究UE的原始碼,也由此有了此篇系列文章的誕生。 基於UE4研發的遊戲大作也愈發多起來,代表作有戰爭機器4、黎明死線、絕地求生、和平精英、刀劍神域、我的世界-地下城、最終幻想VII重製版、嗜血程式碼等等。 ![](https://img2020.cnblogs.com/blog/1617944/202010/1617944-20201026110515108-1634785546.jpg) *最終幻想7重製版真實絢麗動感的畫面。* 除了遊戲行業,影視、模擬、設計、廣電、科學視覺化等行業也逐步引入了UE作為視覺化生產的利器,並逐漸完善了相對應的工具鏈。 ![](https://img2018.cnblogs.com/blog/1617944/201906/1617944-20190627164419772-239234264.jpg) *Unreal Engine 4渲染出的影視級虛擬角色。* ## **1.1.5 Unreal Engine 5(2021)** 在2020年5月,虛幻官方放出了一個展示虛幻5代渲染特性的視訊“Lumen in the Land of Nanite”,視訊展示了基於虛擬微多邊形幾何體的Nanite和實時全域性光照的Lumen技術,給實時遊戲帶來了影視級的視聽體驗。這哪是遊戲,明明是電影!相信當時很多讀者都被這個視訊刷屏了,也著實讓大家驚豔了一把,筆者第一次看到這個視訊時,激動興奮不已,反覆看了好多遍。 ![](https://img2020.cnblogs.com/blog/1617944/202010/1617944-20201026110532663-1976776185.png) *“Lumen in the Land of Nanite”演示視訊的一幀畫面。* 據官方介紹,**Nanite**支援同屏千億級的多邊形數量,意味著不再需要模型拓撲、法線貼圖等傳統美術製作工序,直接採納高模渲染。而**Lumen**是一套全動態全域性光照解決方案,能夠對場景和光照變化做出實時反應,且無需專門的光線追蹤硬體。該系統能在巨集大而精細的場景中渲染間接鏡面反射和可以無限反彈的漫反射。 除此之外,該視訊還展示了Chaos物理與破壞系統、Niagara VFX、卷積混響和環境立體聲渲染等新功能特性。 至於UE5的釋出時間,直接引用官方說明直截了當: > **虛幻引擎4與5的上線時間表** > > 虛幻引擎4.25已經支援了索尼和微軟的次世代主機平臺。目前Epic正與主機制造商、多家遊戲開發商及發行商密切合作,使用虛幻引擎4開發次世代遊戲。 > > **虛幻引擎5將在2021年早些時候釋出預覽版,並在2021年晚些時候釋出完整版。**它將支援次世代主機、現世代主機、PC、Mac、iOS和Android平臺。 > > 我們正在設計向前相容的功能,以便大家先在UE4中開始次世代開發,並在恰當的時機將專案遷移到UE5。 > > 我們將在次世代主機發售後,讓使用UE4開發的《堡壘之夜》登陸次世代主機。為了通過內部開發證明我們行業領先的技術,我們將在2021年中將該遊戲遷移至UE5。 也就是說,UE官方如果不放鴿子的話,將在2021年釋出UE5的完整版。讓我們拭目以待吧。   # **1.2 渲染綜述** ## **1.2.1 虛幻渲染衍變** 縱觀UE的發展史,UE其實也是順應硬體技術和軟體技術發展的趨勢,善於結合軟硬體的新特性,加上軟體工程學、作業系統等等技術封裝而成的結果。比如90年代中期隨著硬體的發展,增加了16位真彩色的渲染管線,98年增加到了32位RGBA;本世紀之初,基於硬體的可程式設計渲染API湧現後,UE緊接著同時支援固定管線(現已廢棄)和可程式設計渲染管線。隨後若干年,HDR湧現,延遲渲染管線的引入,曲面細分、Compute Shader等都遵循著這樣的規律。 ![](https://img2018.cnblogs.com/blog/1617944/201909/1617944-20190906000551544-115196268.jpg) *圖中展示的是DirectX 11新加入曲面細分、計算著色器等新特性。* 一直到前些年,CPU的摩爾定律到達天花板,CPU廠商只能調轉策略大力發展多核心,由此,CPU多核心和GPU資料驅動並行化得到強力發展,以及Vulkan、DirectX12、Metal等輕量化、多執行緒友好的圖形API的出現,UE加入了複雜的多執行緒渲染,以便充分發揮現代CPU多核心和GPU海量計算單元的效能優勢。 ![](https://img2018.cnblogs.com/blog/1617944/201909/1617944-20190906000624032-540802873.png) *CPU的核心頻率增長從1970年到2011年一直保持著摩爾定律,但隨著晶片工藝發展的滯漲,之後就明顯跟不上摩爾定律曲線。(圖右是Intel創始人摩爾本人。)* ![](https://img2020.cnblogs.com/blog/1617944/202010/1617944-20201026110558695-2003534209.png) *2006年前後CPU的效能明顯落後於摩爾定律曲線,但同時,CPU的核心數量也隨之增加。* 由於UE要支援眾多的主流作業系統,封裝眾多圖形API及對應的Shader,所以UE的渲染體系需要層層封裝原始API,將原本簡單的API演變成如今錯綜複雜的UE體系。比如,為了跨多種圖形API,加入了RHI體系,解決使用者層裸呼叫圖形API的問題;為了方便使用者使用和編輯材質效果,引入材質模板和材質編輯器,並且底層使用一系列中間層將shader編譯到對應的硬體平臺;為了充分發揮多核優勢,引入了遊戲執行緒、渲染執行緒、RHI執行緒,為了解決執行緒訪問衝突和競爭,引入了以U開頭的遊戲執行緒代表,同時有與之對應的以F開頭的渲染執行緒代表;為了模型合批、減少DrawCall等渲染優化,增加了動態和靜態渲染路徑,增加FMeshPassProcessor、FMeshBatch、FMeshDrawCommand等概念;為了適應和充分利用Vulkan、DirectX12等這種新型輕量級現代圖形API,UE還在4.22引入了RDG(渲染依賴圖表);諸如此類,枚不勝數。 ![](https://img2020.cnblogs.com/blog/1617944/202010/1617944-20201026110615588-1410809244.png) *Frame Graph(或RDG)將引擎功能模組和GPU資源相分離,結構更加清晰,可以針對性對記憶體、視訊記憶體、Pass等執行排程優化。* 再到前幾年,AI技術隨勢崛起,並被行業研發人員引入到圖形學領域,充分發揮在實時降噪領域。加上NVIDIA的Turing硬體架構對Tensor Core和Raytrace Core的整合,以及微軟在DirectX Raytracing對光追的標準API的整合,實時領域的光線追蹤終於迎來了春天,得到了蓬勃發展。通用商業引擎率先整合實時光追的就是UE 4.22,並且放出了對應的演示視訊[《Troll》](https://www.youtube.com/watch?v=Qjt_MqEOcGM)。 ![](https://img2020.cnblogs.com/blog/1617944/202010/1617944-20201026110638633-1903129902.png) *Epic Games在釋出UE 4.22時,宣佈支援實時光線追蹤,並聯合Goodbye Kansas Studios釋出了演示視訊《Troll》。* 綜合起來,UE渲染體系呈現如今複雜局面的主要原因有: * 順應軟體和硬體技術的發展。 * 迎合面向物件的軟體工程學的思想和設計。 * 架構模組化,提高複用性、可擴充套件性,降低耦合。 * 跨平臺,跨編譯器,跨圖形API。 * 相容舊有的功能、程式碼、介面。 * 提升渲染效率,提升效能比,提高魯棒性。 * 封裝API底層細節,抽離渲染系統的細節和複雜性,以便減輕GamePlay層使用者(邏輯程式設計師、美術、TA、策劃等)的學習和使用成本。 * 為了提升引擎通用性,不得不加入多層次多重概念的封裝。 縱觀整個圖形渲染行業的發展,行業研發人員的目標都是一致的,那就是:**充分利用有限的硬體資源,更快更好地渲染出更具真實或更具風格化的畫面。** ## **1.2.2 內容範圍** 目前已有很多人寫過剖析虛幻渲染的書(如[《大象無形 虛幻引擎程式設計淺析》](https://book.douban.com/subject/27033749/))或技術文章(如[Unreal Engine 4 Rendering系列](https://medium.com/@lordned/unreal-engine-4-rendering-overview-part-1-c47f2da65346)、[《房燕良-虛幻4渲染系統架構解析》](https://download.csdn.net/detail/sinat_14921509/9639244)以及眾多的知乎文章),但是筆者認為他們的文章只能是揭示UE渲染體系的一部分,至少目前還沒發現一本書或一個系列文章能夠較完整地剖析UE渲染體系的全貌。鑑於此,筆者斗膽擔任這個重任,但畢竟精力有限,技術也有限,若有錯漏,懇請讀者們指正。 本系列文章集中精力和筆墨剖析UE的渲染體系,更具體地講,主要限定在以下UE目錄的原始碼: * Engine\Source\Runtime\RendererCore。 * Engine\Source\Runtime\Renderer。 * Engine\Source\Runtime\RHI。 * 部分RHI模組:D3D12RHI,OpenGLDrv,VulkanRHI等。 * 部分基礎模組:Core,CoreUObject等。 當然,如果有需要也會涉及以上並未出現的程式碼檔案,但之後不會特意提出。   # **1.3 基礎模組** 本節主要簡述渲染系統常用到的一些基礎知識、概念和體系,以便對於不熟悉或基礎較薄弱的讀者有個過渡和切入點。如果是UE老手,可以跳過本節內容。 ## **1.3.1 C++新特性** 本小節簡述一下UE和渲染系統中常涉及到的C++新特性(C++11,C++14及之後的版本)。 ### **1.3.1.1 Lambda** C++的lambda是C++11才有的特性,跟C#和Lua等指令碼語言的閉包和匿名函式如出一轍,不過使用上更加複雜、多樣性,更加貼近Native語言獨特的風格。它的語法形式有幾種: ```c++ (1) [ captures ]