您當前的位置:首頁 > 遊戲

UE4的使用要領

作者:由 楊振 發表于 遊戲時間:2020-12-31

全球圖形學領域教育的領先者、自研引擎的倡導者、底層技術研究領域的技術公開者,東漢書院在致力於使得更多人群具備核心級競爭力的道路上,將帶給小夥伴們更多的公開技術教學和影片,感謝一路以來有你的支援。我們正在用實際行動來幫助小夥伴們構建一套成體系的圖形學知識架構,你在我們這裡獲得的不止於那些毫無意義的程式碼,我們這裡更多的是程式碼背後的故事,以及精準、透徹的理解。我們不會扔給人們一本書或者給個思路讓人們去自學,我們是親自來設計出好的課程,讓人們明白到底背後還有哪些細節。

這裡插播一個引擎大賽的訊息,感興趣的同學可以看一眼,這也是東漢書院的立項使命:

大賽官方主頁

簡介

本文開始我們為同學們展示,從一個U3D程式設計師出發,或者從一個引擎程式設計師出發,你應該如何來定位UE4。因為UE4跟一般的引擎還真滴是不一樣的。

關於Shader

或許這是很多程式設計師上來就想研究的問題,畢竟高階嘛。那麼當你使用UE4的時候,UE4是推薦你盡

可能不要寫shader

為嘛UE4不要你寫shade呢?因為你要寫shader,那就得理解人家引擎核心的搞法,你寫的shader引擎核心怎麼呼叫你知道嗎?不知道那還怎麼寫。這或許是UE4的強大也是UE4的傷痛。只有頂級程式設計師能給UE4寫shader。

與U3D對比

與U3D對比,UE4可以說是更遊戲引擎的一個東西,U3D是一個殘缺的半成品,但是這樣的半成品的好處就在於我可以玩出很多花樣。

而UE4,大部分人都可以做成差不多一樣畫質的遊戲,只有少部分人做出來的遊戲可能效能會明顯比其他人做出來的遊戲效能好。

UE4幫你調好了所有引數,隨便來個人,扔幾個模型進去,調一調引數也能出一個電影級畫質。而且UE4作為一個歷史悠久的遊戲引擎,它對渲染的描述以及架構是非常到位的。這也是一般人不會在UE裡寫Shader的原因,因為UE4的級別太高了,沒照顧小菜鳥。

UE4也非常激進的只支援ES3。1和SM5的硬體。

多執行緒渲染

UE採用的是多執行緒渲染,渲染執行緒裡的東西與邏輯執行緒裡的東西是分開儲存的,所有絕大部分類為了解決這樣的一個多執行緒架構帶來的問題,都會把資料分開儲存。渲染執行緒只會訪問渲染執行緒該訪問的資料物件,而邏輯執行緒也只訪問邏輯執行緒該訪問的資料物件。

UWorld:一個UWorld包含了若干個Actor和Component,它們之間可以互相互動。UWorld可以採用Stream的方式載入Level或者解除安裝Level,並且多個World可以同時被啟用。

ULevel:一個Level由若干個Actor和Component組成,它們被儲存在Map檔案裡,載入一個Level的時候會同時把它們都載入進來,解除安裝一個Level的時候,這些Level裡的物體也會同時被解除安裝。

USceneComponent:那些可以被載入到FScene裡去的物體的基類,比如燈光、Mesh、霧等等之類的東西。

UPrimitiveComponent:所有的場景中可以被渲染或者是可以進行物理模擬的物體的基類。這些東西同樣可以被用於可見性剔除的模組以及渲染特定的資料(比如投射陰影)。就如同UObject型別的物體一樣,邏輯執行緒持有這個物件的所有屬性變數和狀態,渲染執行緒不應該直接去訪問這個類的物件。

ULightComponent:表示的是一個光源。相關的渲染器需要把它對場景的影響計算出來併合成到最終的場景裡面去。

FScene:UWorld的渲染執行緒裡的版本。當一個物體呼叫RegisterComponent介面之後,這個物體才能被新增到FScene裡去。渲染執行緒控制著FScene的所有狀態,邏輯執行緒不能直接對它進行修改。

FPrimitiveSceneProxy:UPrimitiveComponent的渲染執行緒裡面的版本,它就是在渲染執行緒裡映象了一份UPrimitiveComponent的各種狀態。這個東西存在於Engine模組,它可以被繼承,來派生出子類物件用來支援各種不同種類的可被渲染的東西(skeletal、grid、BSP等等)。它會實現一些非常重要的函式比如GetViewRelevance,DrawDynamicElements等等。

FPrimitiveSceneInfo:UPrimitiveComponent和FPrimitiveSceneProxy的內部渲染狀態。在Renderer模組裡,Engine模組看不到這個東西。

FSceneView:引擎對FScene的一個畫面的描述。在FSceneRenderer::Render中,一個Scene可以被渲染成不同的view(Editor中的多視口)或者在FSceneRenderer::Render中的同一個dc中被渲染成多個視口(在遊戲中的分屏渲染)。每一幀都會構建一個全新的view。

FViewInfo:在Renderer模組中,一個view的內部renderer的描述方式。

FSceneViewState:在遊戲中,每一個ULocalPlayer會有一個view state,view state可以把一個view的渲染資訊傳遞到別的渲染幀裡面去。

FSceneRenderer:每一幀都會建立一個這樣的例項來儲存一些每一幀裡面的臨時變數。

FMaterial:在渲染執行緒中被使用的材質的介面類。提供了材質屬性的訪問介面(比如混合模式)。包含了一個ShaderMap來供渲染器去查詢它需要的shader。

FMaterialResource:FMaterial介面的UMaterial的實現

FMaterialRenderProxy:渲染執行緒裡的材質的描述方式。提供了對FMaterial的訪問以及當前的常量、向量和紋理引數。

UMaterialInterface:邏輯執行緒裡對材質功能的抽象介面。這個東西被用來去查詢在渲染的時候被使用的FMaterialRenderProxy並且UMaterial被用作資料來源。

UMaterial:一個材質資源。它需要計算出材質中那些用來著色的屬性,設定混合模式等等。

UMaterialInstance:一個UMaterial例項的抽象介面。在連連看裡可以給材質提供不同的引數。每一個材質的例項都繼承了UMaterialInterface。因此一個材質的例項的爹可能是一個UMaterial或者是另一個材質例項。無論子父關係有多麼的長,最終都會追溯到UMaterial基類。

UMaterialInstanceConstant:一個不能在編輯器裡修改的材質例項。它可以提供常量,向量紋理以及靜態開關變數。

UMaterialInstanceDynamic:一個可以在執行時進行修改的材質例項。可以提供常量,向量以及紋理引數。它無法提供靜態開關的引數並且它無法成為另一個UMaterialInstance的父類。

完結、撒花,接下來我們做更多好玩的東東

我們核心關注和討論的領域是引擎的底層技術以及商業化方面的資訊,可能並不適合初級入門的同學。另外官方維護兩個公眾號,第一個公眾號是關於我們企業自身產品的資訊與動態的公眾號,如果對我們自身資訊與動態感興趣的同學,可以關注

圖形之心

。我們核心關注和討論的領域是引擎的底層技術以及商業化方面的資訊,可能並不適合初級入門的同學。另外官方維護兩個公眾號,第一個公眾號是關於我們企業自身產品的資訊與動態的公眾號,如果對我們自身資訊與動態感興趣的同學,可以關注

圖形之心

除此之外,我們為了更頻繁的釋出一些諮詢與文章,我們維護的第二個公眾號是“

核心觀察

”,

核心觀察

提供的主要是一些與我們無關的諮詢與文章。

隻言片語,無法描繪出整套圖形學領域的方方面面,只有成體系的知識結構,才能夠充分理解和掌握一門科學,這是藝術。我們已經為你準備好各式各樣的內容了,東漢書院,等你來玩。

標簽: 渲染  執行緒  UE4  材質  引擎