1. 程式人生 > >UE4 PBR虛幻引擎4貼圖和材質建立_GDCC2015

UE4 PBR虛幻引擎4貼圖和材質建立_GDCC2015

裝載自:https://blog.csdn.net/pizi0475/article/details/49681053

 

PBR

PBR:應用於虛幻引擎4貼圖和材質建立

PBR材質似乎在一夜之間改變了人們對於引擎實時渲染畫面的理解。在遊戲中我們也能夠體驗到鏽蝕的金屬,厚重的皮革,精細的紋理,更加真實的世界從此展現在眼前。從此,PBR材質成為了“次時代”遊戲必備的標準。

在GDCC2015,來自Epic Games資深開發者支援美術設計師李文磊,為大家帶來應用於虛幻引擎4貼圖和材質建立的啟示。

以下內容是演講實錄:

PBR是個不老不新的話題,很早它就出現在預渲染的渲染器裡,隨著硬體越來越快,尤其是顯示卡,最近幾年逐漸的開始應用到實時渲染中來。

今天就和大家一起來聊聊虛幻引擎實時渲染引入PBR以後,我們怎麼來正確的使用它

PBR即基於物理的渲染,渲染包括燈光,shader, 材質, 貼圖,以及他們之前如何互動影響的,今天的演講內容主要分三部分內容。1.真實世界的光,材質,以及他們之間的互動是如何的,2. UE4裡是如何來模擬真實世界的,3.我們該怎麼做才是正確的。

要學會使用PBR首先需要了解什麼是PBR,需要從真實世界的這些PBR材質特有的屬性拆分開來去了解他們,這樣我們就需要了解光,物體表面材質以及光是如何與材質互動的。 光包括了顏色,亮度,衰減,強度,形狀等主要屬性,真實的世界中永遠是多光源並存,除非身處於宇宙深空之中。

我們把自身能發光的物體叫做直接光源,自身不發光僅僅反彈其他光源的物體叫做非直射光源。分析下這張圖,從美術角度我們把他分成主光,輔光,裝飾光。雖然天色已晚主光還是來自於天空,天空的光線來自於太陽的散射,因此主光來自於一個天空的非直射光

附光來自於路燈,大的城市照明。這些光大都數也是反彈光,而非燈泡光源直接照射到。因此前景的人物基本是在一個天光的環境下低對比低照度的燈光環境下

那麼自然界中的材質是如何跟光互動的呢?燈光照射到物體表面後兩種情況,反射或繼續前行折射。折射後的光線被吸收(一般轉化為熱),或離散。光線被吸收的行為不是發生在表面,而是次表面,或者內部反射不會帶出任何顏色。

吸收會使光線強度降低,吸收某一光譜的光線,餘下的光線顏色變化,但方向不變

離散後方向改變,強度不變這裡對於絕緣體和導體,兩者與光的互動是完全不同的

絕緣體,即非金屬的反射率普遍很低,一般在2%-8%左右,大部分光線進行折射,折射後的光線或者被吸收,或者重新離散出來。這部分折射的光線吸收率和材質的明度有關,暗的吸收多,亮的吸收少;離散後光線的顏色也取決於物體表面顏色;

對於導體,即金屬,反射率普遍很高,達到70%-100%,所以大部分光線會以鏡面反射的形式反彈回來。小部分光線折射後完全被吸收(光是一種粒子,被導體吸收),不同的金屬吸收不同波長的光線,導致鏡面反射回的光線帶有顏色;

漫射和鏡面反射:漫射為反射光線方向隨機,不一致;鏡面反射為一個方向。鏡面反射會根據物體表面的粗糙程度表現不同結果。但無論光滑粗糙,反射的總能量是一樣的,而且光線反射後的強度不變。漫射是光線被折射的表現。光線從一種媒介進入另一種媒介,並在裡面經過多次的散射後從近似入射點的位置返回原來的介質中。漫射過程中除了光線的離散光線還會被吸收(轉化成熱能)。光線進入介質不深,那麼進入點和離開點的差別就可以被忽略。那種光線離散性高,但吸收性弱的材質有時指參與介質或者叫透明材質。比如煙,牛奶,面板,翡翠,大理石等。

      

而在更細微的層面,比如顯微鏡下,微表面就是物體表面細微的不規則。根據不同的流程可以叫粗糙度,光滑度,光澤度。表面的不規則度其實對於慢反射的影響視覺上不大,因為漫射的這種離散和吸收過程是發生在材質內部的而非表面。

微表面理論就是建立在物體表面這種細微不規則性的基礎上的。可以把它看作許許多多不同方向的面,這些面就叫做微表面。光線對於這些面對入射角都是不一樣的,反彈後的角度也不一樣,並且有的地方被擋住,有的地方會產生陰影,視覺上會產生模糊的反射

在引擎中的明暗shading計算引入了各種函式理論模型,來儘量逼近模擬自然界的物理現象

我們可以通過BRDF來了解UE4裡面是如何模擬的。

BRDF 雙向反射分佈函式(Bidirectional Reflectance Distribution Function,BRDF)場景中的光照射到材質表面反射到視點的光亮度計算方法函式,來定義材質屬性。它描述了入射光線經過某個表面反射後如何在各個出射方向上分佈,這可以是從理想鏡面反射到漫反射

UE4 PBS中引入了各種BRDF理論模型,也可以在shader裡選擇預設模型,最終需要效率和效果的一個最佳結合點。

通過一些簡單的引數,我們可以在引擎中用來區分不同型別材質的反射特性。

在UE4材質裡面,每一個input都有著各自的特性,他們的組合成為了一個個不同屬性的物理材質。

通過一個簡單的Metallic引數的調整,我們就可以輕易區分兩個完全不同的材質。

物體表面的反光屬性也是這樣一個非常重要的引數,通過這張圖片,我們就能夠非常清晰的區分開來。

那麼如何製作一個高質量的PBR材質,如何選擇使用的工具,如何設定燈光呢?、

首先觀察生活中的真實物體是非常重要的環節,它能夠給你一個基本的概念,不同的材質應該有哪些不同的屬性。在設計過程中,我們會有一些描述性的詞語來清晰說明目標材質的屬性(文字+圖片),描述詞彙包括

材質型別:鋼,塑料,鐵,玻璃,油漆

材質明度顏色

材質表面處理:打磨過的,拋光,磨砂

材質環境影響細節描述: 生鏽的,刮擦的,磕碰的,髒的,油膩的,油漆剝落的,積灰的,嶄新的

翻譯這些資訊到UE的材質屬性,材質型別的資訊來區分金屬還是非金屬,材質明度及顏色來定義BaseColor,表面處理關係到Roughness,環境影響複雜多變,牽扯到包括以上多個通道。

比如髒舊磕碰的金屬掉漆的表面:掉落油漆的部分為金屬,未掉落部分為油漆,在材質型別金屬性的定義裡區分開來;磕碰資訊從法線貼圖,粗糙度貼圖;新舊又影響鏡面反射的量和連續性,又和粗糙度貼圖有關

在專案開始前問幾個問題:

  1. 材質需要共用嗎?
  2. 材質的精度要求高嗎?
  3. 材質需要統一管理迅速迭代嗎?
  4. 需要自定義或允許改變外觀嗎?
  5. 效率/記憶體:材質能夠多複雜?貼圖能夠支援多少?
  6. 是否需要複用?
  7. CG or Game?
  8. 需要改變貼圖嗎?
  9. 記憶體多大?
  10. 客戶端大小?
  11. 編輯器內還是外
  12. 其他問題

通過建立區分材質,將一個模型不同的區域區分開來,區分大塊面材質的意義在於一個物件有多種材質,必須有區分它們的mask,方便隨時修改不同材質區域的貼圖,提供在引擎中更換不同區域的材質的可能性,為進一步在表面增加細節提供區分的通道

區分材質的資訊是灰度圖,不同的區域可以放在一張RGBA貼圖的各個通道里;根據材質的數量可以是單張或多張。

真實的世界中,每一個材質都有許多的細節,所以接下來,為材質新增更多的細節,比如劃痕,汙漬,環境元素等,這些資訊來自於模型起伏,法線,可以手動選取;經常由一些工具軟體生成,這些工具軟體可以比較只能的根據已有的模型資訊判斷和生成出自然的細節。

將大塊面的材質區分通道和細節材質區分通道進行混合,由於大塊面材質區分通道和細節材質區分通道是分離的給混合提供了更多的自由度,這種自由度表現在可以控制哪些細節可以出現或者被遮蔽在哪些區域。

現在在市面上可以看到大量的工具可以幫助在UE4裡面完成PBR材質的製作,在這裡我們列舉出了一些主流的配套工具。

製作的過程分為三個部分,從高模和低模創建出NormalMap,ID Mask ,AO和Cavity。然後再上面新增必要的細節,最終匯入UE4。

在這裡我們可以通過這些工具來增加細節貼圖,在引擎中合併,這樣可以讓材質更為真實。

通過以下這些步驟,我們就能夠表現多層材質

  1. 匯入:主MASK, 細節MASK, NORMALMAP, AO, CAVITY
  2. 建立基本材質,包括基本材質中細節新增的可能性
  3. 建立母材質,混合基本材質
  4. 新增更多變化:圖案,潮溼度/多孔性
  5. 建立材質例項

材質貼圖都完事了?還沒結束呢。PBR的關鍵之一燈光:建立真實的燈光環境。 (這裡不談論藝術的燈光環境,僅追求真實)

真實的燈光包括直射光,非直射光, 並且HDR,在燈光半徑範圍內的物體表面會被燈光直接照亮,並有高光點;範圍外物任何照明(包括漫射和鏡面反射)。

在真實世界中燈光理論上是沒有範圍的,雖然隨著距離增加照度降低,但始終會有影響,在鏡面反射上尤為明顯。

這種反射在UE4裡需要由高動態的環境反射貼圖來表現,是一種IBL的照明方式。

有了燈光的烘托,一把次時代PBR材質的武器就正式登場了。

PBR材質是未來的標準,在傳統材質轉換到PBR材質的過程當中,我們會遇到很多的挑戰。對於傳統貼圖到PBR貼圖沒有一鍵轉換的工具,因為有些資訊計算機是無法猜測出來的,還是需要主觀去判斷。目前有兩種PBR流程貼圖轉換可以使用工具。

現在的燈光有直射光,陰影,也有間接光,間接反射等,所以貼圖上不需要把燈光資訊畫上去,只要專注於表達材質屬性。我們不需要畫高光顏色(反色)來達到一個看上去是白色的;線性空間渲染意味著對於basecolor的明度範圍大概30-50 到180-250

能量守恆使得高光如何怎麼變都不會增加或減少,就不需要手動的來調整貼圖使得粗糙的地方高光貼圖暗,光滑的地方高光貼圖亮。這時候就需要用已有的資訊或修改後生成roughness,Cavity:來定義微表面的變化。

通過這樣的調整,我們就能夠將傳統的材質轉化到PBR材質。為我們的遊戲新增更好的質感。