1. 程式人生 > >PBR基於物理渲染

PBR基於物理渲染

什麼是基於物理渲染(PBR)?

傳統3D材質製作方法是基於藝術家的手藝的,由美術根據個人評估繪製Diffuse貼圖調整顏色後進行渲染。好處是畫成什麼顏色就是什麼顏色,製作流程簡單修改直觀,缺點則是質量不穩定,難以標準化和做進一步的細緻分工,導致遊戲製作規模受到人力限制;此外,在複雜變化的光照環境下,僅通過RGB值定義的貼圖往往無法達到足夠的擬真感。

基於物理渲染的本質,則是通過對真實世界的物理現象進行逼近、模擬、再現,使3D物件在不同環境下都能展現出逼真的渲染質感,並通過材質的引數化將材質製作這一手工業流程轉化為標準化流水化的工業流程。

為了實現這個目標,對於貼圖的定義就不能再只是傳統的RGB值,而是一系列與真實光學現象有關的實際測量物理引數;由於對於一個特定的物理材質,其物理引數總是恆定的,這也使得通用材質庫成為可能。

以上,可以很容易歸納出PBR的三塊核心內容:

  • 與人類視覺有關的真實光學現象/過程有哪些

  • 一個基於物理渲染的材質球應該具有哪些對應的引數

  • 接收引數後,如何完成渲染過程獲得最終輸出的顯示色彩

視覺基礎眼睛如何看見物體

眼睛如何看見物體


一切皆為光的反射,PBR的本質也就是演算法模擬光學過程。

光照Lighting、著色Shading、感光Sensitising即是一次完整視覺過程的三個步驟,後面會依次講到……

人眼能感受到的光



顏色由光的波長決定,與一些散射/衍射現象有關

光照Lighting

基礎計量單位 

  • 球面度(sr)

    立體角的國際單位。它可算是三維的弧度。以r為半徑的球的中心為頂點,若展開的立體角所對應的球面表面積為r2,該立體角的大小就是一球面度。球表面積為4πr2,因此整個球有4π

    個球面度。

          

  • 坎德拉(cd)
    定義光源亮度的單位。1cd = 1/683W / sr,約為一支蠟燭的亮度,或220V下1W白熾燈的亮度。之所以會這樣是因為這個單位在制訂時就考慮到了人的視覺……

  • 流明(lm)
    光通量單位,用於衡量在空間中傳播的光的強度。1坎德拉的點光源向周圍的球形空間內投射出的光通量為 4π流明(或者1球面度流明)

  • 勒克斯(lux)
    照度單位,用於衡量一塊麵積上受到的光照強度。1勒克斯= 1流明/平米 = 1坎德拉/球面度。

  • 平方反比定律
    光照與距離遠近的平方成反比例衰減。即對於一個光源,若距離該光源距離為r的固定面積上的光通量為x,則距離該光源2r處同樣面積上的光通量為1/4x。(基於能量守恆)



散射/折射

光照與距離遠近的平方成反比例衰減。即對於一個光源,若距離該光源距離為r的固定面積上的光通量為x,則距離該光源2r處同樣面積上的光通量為1/4x。(基於能量守恆)



米氏散射

當介質內微粒直徑>=入射光波長時,會發生米氏散射。雲/霧等基本均為米氏散射。其特點為:

  • 大部分入射光線會沿著前進的方向進行

  • 微粒半徑會改變米氏散射模型(具體來說是光線偏折角度及偏折比例)



對於自然環境影響如下:



瑞利散射

當介質內微粒直徑<=入射光波長的十分之一時,會發生瑞利散射。瑞麗散射的散射強度與光波長的4次方成反比,因此短波長的藍光的瑞利散射更劇烈。因此天空是藍色的而陽光則偏黃。



IES Light

照明工程協會(Illuminating Engineering Society),提供了標準化的照明燈具的光度學資料(PhotometricProfile)資料,PBR光源製作時的重要資料來源。

IES Light = 最大光強(坎德拉) * IESPhotometric Profile




燈光色溫(K)

色溫低則偏暖,色溫高則偏冷。

幾個可供參考的色溫值:

  • 晴朗藍天         10000-12000K

  • 多雲有雨         8000-10000K

  • 薄霧         6500-8000K

  • 日光型熒光燈         6500K

  • 正午陽光         5500K

  • 電子閃光燈     5500K

  • 早晨或下午的陽光         4000-5000K

  • 攝影棚燈光     3000-4000K

  • 石英燈     3500K

  • 鎢絲燈具         2700-3200K

  • 黎明、黃昏     2000-3000K

  • 燭光         1800-2000K



燈光型別

平行光、點光、面光。




著色Shading

PBR中,Shading的本質其實就是計算材質對入射光的反應,因此會牽涉到以下兩個內容:

  • 材質本身的物理引數

  • 光線反射計算模型

雙向反射分佈函式(BRDF)

BRDF:Bidirectionalreflectance distribution function,基本式為:,用於定義光線在不透明表面反射的函式,其中變數包括:光的入射角、不透明表面法線、光線反射角,函式返回值為反射光線與入射光線的輻射率比值。



這一函式實際上是對於真實世界光照的簡化逼近,將真實世界中複雜的光照反射過程簡化成基於反射點單點的概率分佈函式:



獲取一種材質的BRDF,有三種方法:

  • 基於經驗。也就是開發人員根據自己的經驗推測出的公式(例如200多年前就存在了的用於描述粗糙表面光線反射的Lambert光照模型)

  • 基於物理模型。根據物理理論創立的數學模型,後面會詳細介紹

  • 資料驅動模型。用儀器測量並匯出資料,簡單省事兒……(隨手網上找了張不怎麼高大上的圖)



物理著色模型的基本原則

  • 一致性:入射光源與觀察攝像機交換位置後,得到的反射計算結果應該等價(即光路可逆)

  • 能量守恆:入射光線能量 >= 反射光線總能量

  • 恆為正值:傳播正能量

經典通用模型

Pixar與1990年首先定義的渲染模型,沿用至今,該模型下,觀察者所見到的材質某一點的顏色 = ambient + diffuse + specular,如下圖:


Diffuse即漫反射,之後會詳細介紹。

Specular為高光反射,之後會詳細介紹。

Ambient為環境光,這裡沒有展開細說……

漫反射 Diffuse

漫反射實際上是光在射入物體表層後,在物體內部折射散射後,再離開物體表面後形成的,後面有幾個簡化的數學模型,用於近似模擬這一過程。

  • Lambert模型


Lambert模型是最簡單的光照模型,該模型認為當光照射到一個粗糙表面時,會向周圍均勻反射(各向同性),反射光的強度與(入射光方向和反射點處法線夾角的餘弦)成反比。

  • Oren-Nayar模型

基於Lambert光照模型的改良,該模型認為材質表面可以視為由多個不同法線的光滑Lambert表面所構成粗糙表面,但每個子表面的光線反射可以用Lambert模型進行描述。因此在這個模型可以視為多了一個“粗糙度”引數的Lambert模型,或者可以將Lambert模型視為粗糙度=0的Oren-Nayar模型。



模型公式中可以看到有個重要的引數ρ,表示反照率。

  • 模型引數:反照率(Albedo

物體反射光輻射量與入射光輻射量之比即為反照率。在3D製作中,這代表一張正確的Diffuse貼圖。而所謂“正確”的Diffuse貼圖,需要滿足以下條件:

  • 不受漫反射光線以外的額外光線影響(例如高光、環境光、陰影等)

  • 不受曝光偏差影響亮度

  • 不受色溫影響色相



一旦Diffuse貼圖製作不滿足以上三條要求,整個PBR渲染出來的結果就會與實際嚴重不符,所以要獲得正確的Diffuse貼圖也需要一些方法……

  • 色卡法。在拍攝取材時使用標準色卡,之後可根據色卡調整照片的色溫及曝光。但這個方法無法消除材質上的高光。

  • 交叉偏正法。在專門的封閉空間內,使用偏振光照明,用偏光濾鏡過濾高光反射,再拍攝取材。缺點嘛就是麻煩……



高光 Specular

目前普遍採用Cock-Torrance模型,該模型類似Oren-Nayar模型,也認為材質表面有無數個法線各異的微表面,但不同之處是,Cock-Torrance模型中,這些微表面僅進行鏡面反射。由於是鏡面反射,一旦給定了入射光源,每一個微表面將僅有一道反射光。


在該模型中,當且僅當觀察者視線與反射方向光線重合時(亦即反射光線可以抵達觀察者攝像機),對應的微表面才被啟用,而未被觀察到的微表面則不被啟用。

在高光反射過程中,會牽涉到這麼幾個玩意:

  • 微表面相關的分佈函式

  • 幾何衰減函式(根據經驗人工修正簡化數學模型導致的問題)

  • 菲涅爾函式(用於處理菲涅爾現象)


接下來會解釋這三者。

  • 分佈函式

分佈函式用於描述材質微表面的顯微結構,或者說描述其微表面的粗糙度,其範圍在0-1之間,數值意義為微表面斜率的平方根(即粗糙度越大,則微表面傾斜更厲害)




  • 幾何衰減函式

在現實世界中,崎嶇的表面會對入射光線和反射光線都發生遮擋,如果忽視這一現象直接應用微表面計算高光時就會出現一個問題:粗糙的表面實際上大大增加了反射表面積,會導致直接計算得出的反射光能量高於入射光能量總和,違反了能量守恆定律。因此需要引入幾何衰減函式修正反射光光量。在做光線遮擋修正時一般僅考慮入射光被遮擋和反射光被遮擋這兩種情況,現實世界中還會出現光線的多次反射,一般就都忽略了,實在是做不到啊……


現存的分佈函式即幾何衰減很多,基本都是基於概率分佈的數學逼近;目前最常用的是GGX。



  • 各向異性 Anisotropic

有些材質在不同方向上的高光表現是一樣的,這稱為各向同性;例如一塊絕對光滑的金屬板。

有些材質在不同方向上的高光表現是不同的,這稱為各向異性;例如一塊經過人工打磨拉絲的金屬板,或者尼龍襪。

當物體表面的微表面法線呈現有規律分佈時,就會表現出各向異性。



  • 高光剔除Specular Occlusion

對於物理模型的人工修正,用於減少一些不應受光部位出現反光的漏光問題。這並不是嚴謹的PBR模型流程(亦即在完美的PBR中這一步應該不存在)




  • Cavity

用於模擬顯微結構所形成的凹陷孔洞,與高光剔除一樣,是非PBR的人工經驗修正

應該是用來給物件增加歲月滄桑感用的,不展開…… 



  • 模型引數:電導率Metallicity

該引數用於描述材料的電導率,0表示絕對絕緣,1表示毫無電阻(超導體),0和1幾乎都不會出現在真實世界中。

該引數的物理意義涉及到電磁波在物質中傳播的物理模型:電導率越高的材料,則其帶有的自由電子就越多。當作為電磁波的光接觸到材料時,電導率高的材料會立刻將光能吸收,並很快隨著電子能級態的改變而重新將光反射出去。

放到PBR中,電導率1的材質將完全不再有任何漫反射,只會進行鏡面反射。



  • 模型引數:反射率 Refelectance

在材質表面正上方打光,材質反射回光源的高光佔入射光光通量的比例即為反射率




菲涅爾函式用於描述菲涅爾反射現象:即材質的反射率均會隨著觀察者視線與其表面法線夾角大小改變;對於非金屬材質來說,通常該夾角越小(即從材質正上方觀看),反射率越低;該夾角越大(即側視),反射率越高。




以下是某著名的菲涅爾函式表:


可以看到金屬是一類很特別的材質,其會在視線與材料表面夾角約60-75度時反射率下降,之後再75-80度角時再急劇升高至1。

  • 模型引數:孔隙率Porosity

用於描述物體表面的孔隙,用於計算液體浸潤對材質的影響。並非所有PBR系統都會帶有該引數。



感光Sensitising

目前能參考的感光物件有兩種:CMOS/CCD,人眼。

簡單來說,人的視覺是非常複雜的,例如人眼所看到的其實是大腦經過後期加工完成的影象,因此具有非常不科學的寬容度和視野範圍,而且針對人感興趣的地方,大腦還會動態改變視覺焦點內外的解析度……所以PBR只能參考CMOS/CCD來調整成像效果,畢竟人眼實在太難逼近了,臣妾做不到啊……






所以接下來,就要涉及到成像時的兩個重要步驟:曝光與後期處理。

曝光


現實世界中的亮度範圍、相機可接受的亮度範圍和遊戲中最終可以顯示的亮度範圍是不同的,因此需要控制到達攝像機光亮,亦即控制攝像機的曝光。

在這裡要區分一下“曝光值”和“曝光量”這兩個單位:


以及,目前絕大多數遊戲引擎的感光度ISO都設定在100。

然後是以此衍生出的一批資料:




(感覺以後做VR早晚都得查這張表……)

在這裡演講者提到,使用曝光量為引數進行設定比較好,一來很直觀(與最終效果直接相關),二來可以將光圈、快門速度等留給後期處理。

後期處理

後期處理包含色彩調校、運動模糊、景深、暗角等,基本都和光圈大小、快門速度、焦距掛鉤。

  • 光圈越大,則景深越小

  • 光圈越大,暗角越明顯

  • 快門越慢,運動模糊越明顯



HDR Tone Mapping

遊戲引擎最終能呈現的影象色彩每個顏色通道僅能保留8bit,而相機能接受的光色範圍卻更大,因此需要在最終輸出畫面前去除掉一部分色彩資訊、保留甚至增強畫面的動態層次。這便是HDR Tone Mapping的工作內容。

在去除色彩資訊的過程中,高動態畫面向低動態畫面對映時往往會導致亮度損失,因此Tone Mapping常常需要選擇性調整亮度。這裡要指出,人眼對於暗部的細節感知度更高。

演講者在此對比了Reinhard和Filmic兩種常用的Tone Mapping曲線,其中Filmic曲線還做了一些取巧,做了一根S型的Mapping曲線,以此拉大畫面的對比度。總之呢就是,HDR Tone Mapping要怎麼搞,還是得看專案的藝術風格方向是啥樣的。





相關推薦

PBR基於物理渲染

什麼是基於物理渲染(PBR)? 傳統3D材質製作方法是基於藝術家的手藝的,由美術根據個人評估繪製Diffuse貼圖調整顏色後進行渲染。好處是畫成什麼顏色就是什麼顏色,製作流程簡單修改直觀,缺點則是質量不穩定,難以標準化和做進一步的細緻分工,導致遊戲製作規模受到人力限制;

基於物理渲染的入門資料

https://tieba.baidu.com/p/3922888163?red_tag=1467409146https://tieba.baidu.com/p/3922948521?red_tag=1468761448https://tieba.baidu.com/p/39

基於物理渲染技術(PBR)系列一

筆者介紹:姜雪偉,IT公司技術合夥人,IT高階講師,CSDN社群專家,特邀編輯,暢銷書作者,國家專利發明人;已出版書籍:《手把手教你架構3D遊戲引擎》電子工業出版社和《Unity3D實戰核心技術詳解》電子工業出版社等。PBR,或者用更通俗一些的稱呼是指基於物理的渲染(Phys

基於物理渲染技術(PBR)系列二

筆者介紹:姜雪偉,IT公司技術合夥人,IT高階講師,CSDN社群專家,特邀編輯,暢銷書作者,國家專利發明人;已出版書籍:《手把手教你架構3D遊戲引擎》電子工業出版社和《Unity3D實戰核心技術詳解》電子工業出版社等。繼續上篇部落格中基於物理的渲染技術(PBR)系列一的講解,

基於物理渲染技術(PBR)系列三

筆者介紹:姜雪偉,IT公司技術合夥人,IT高階講師,CSDN社群專家,特邀編輯,暢銷書作者,國家專利發明人;已出版書籍:《手把手教你架構3D遊戲引擎》電子工業出版社和《Unity3D實戰核心技術詳解》電子工業出版社等。BRDF,或者說雙向反射分佈函式,它接受入射(光)方向ωi

基於物理渲染技術(PBR)系列四

筆者介紹:姜雪偉,IT公司技術合夥人,IT高階講師,CSDN社群專家,特邀編輯,暢銷書作者,國家專利發明人;已出版書籍:《手把手教你架構3D遊戲引擎》電子工業出版社和《Unity3D實戰核心技術詳解》電子工業出版社等。接著上一篇部落格講解的內容基於物理的渲染技術(PBR)系列

基於物理渲染—HDR Tone Mapping

TE 包含 反射 HR AC ogr 轉換成 repr BE 在遊戲引擎渲染管線中,我們對於R、G、B通道顏色信息的數值範圍通常設置在[0,1]之間(或者是[0,255])。其中,0代表沒有光亮度,1代表顯示器能夠顯示的最大光亮度。這個表示方式雖然直接易懂,但它並不能反映真

基於物理渲染WardBRDF模型

    Notes on the Ward BRDF1 介紹WardBRDF在1992年作為經驗模型被引入用來測量BRDF資料,它有幾個優點超過了以往的模型 並且廣泛應用於計算機圖形學,它只使用了幾個簡單可控的引數,可以模擬各項異性的的表面,表現效果相當好。本文的目的是澄清和糾正一些WardBRDF的實現細節

CocosCreator之KUOKUO帶你做個基於物理的跑酷遊戲第一部分-做個地圖加點盒子

本次引擎2.0.5 編輯工具VSCode 目標:第一部分,做個瓦片地圖,加入物理盒子。   首先開啟這個: 沒有的小夥伴們,百度一下哦。 (可以說是一般的2D遊戲,必備的軟體) 新建一個檔案,裡面的引數根據你手中素材設定。 然後我們添加個素材,瀏

CocosCreator之KUOKUO帶你做個基於物理引擎的繩子關節的duang~

本次引擎2.0.5 編輯工具VSCode 目標:基於物理引擎的繩子關節的duang~   來吧,讓我們走進物理世界! 新建工程: 單色精靈背景,單色精靈地面。 然後給ground加剛體,加個物理碰撞盒子。 設定為靜態。 好了,我們弄個r

CocosCreator之KUOKUO帶你做個基於物理的跑酷遊戲第二部分-做個動畫加點炸彈

本次引擎2.0.5 編輯工具VSCode 目標:第二部分,做個主角動畫,加入炸彈。   把幀動畫資源匯入,然後把zhujue大小改了,圖片改為我們序列幀動畫第一個。 素材結尾給出。 開啟動畫編輯器,弄一個走(就是跑),還有一個跳躍的。 好了,開啟。選精靈選

基於物理的的相機(一):曝光

Moving Frostbite to Physically Based Rendering中講了Frostbite引擎的基於物理的整套管線流程,其中就包括物理相機 世界中的部分物體亮度是很高的,比如光源,相機的亮度範圍也是有限,就需要將世界的亮度重新對映到相機的亮度範圍,

【SylixOS】Qt 基於FrameBuffer渲染介面

簡介 1 SylixOSFB 12.1 外掛的初始化 12.2 視窗繪製 12.3 SylixOSFB的實現 2 1.簡介Qt是目前一款比較主流的人機互動介面庫。它有很強的跨平臺能力,可移植性好,被廣泛應用在PC端以及嵌入式領域。Qt可大致分為兩部分:QtGui和QtCore,QtGui提供開

【SylixOS】Qt 基於FrameBuffer渲染界面

使用 流程圖 界面 屏幕 watermark 開發人員 內核 sfb drm 簡介 1 SylixOSFB 12.1 插件的初始化 12.2 窗口繪制 12.3 SylixOSFB的實現 2 1.簡介Qt是目前一款比較主流的人機交互界面庫。它有很強

CocosCreator之KUOKUO帶你做個基於物理引擎的輪子小車的duang~

本次引擎2.0.5 編輯工具VSCode 目標:基於物理引擎的輪子小車的duang~   來吧,讓我們走進物理世界! 新建工程: 單色精靈背景,單色精靈地面。 然後給ground加剛體,加個物理碰撞盒子。 設定為靜態。 然後我們弄個車!

流體模擬學習——基於物理的流體動畫

基於物理的流體動畫 最近開始學習流體,這些天看了很多論文,一直來不及整理。正好今天是程式設計師節,忙裡偷閒釋出一下看論文時記的一點筆記。 基於物理方法的流體模擬,最經典的當然是Course notes的Fluid Simulation,但英文啃起來太難受了,搭配

基於過程渲染的小地圖shader

小地圖中有很多標誌物,大量的物件一直顯示在螢幕中,所以想了一種優化方式,優化點這部分的效能 優點: 1. 只需要一個DrawCall,全部渲染到一張圖片,就可以渲染出小地圖 2. 不需要生成大量的標誌物例項 3. 規則圖形直接使用程式碼計算生成來代

基於SDF渲染字型

18號字型 18號字型放大15倍 基於sdf渲染字型放大15倍 相比常規的渲染方式,基於SDF渲染文字可無限放大並保持清晰,幾乎沒有開銷就可實現描邊,發光,抗鋸齒等效果.且它只需要很小的紋理快取SDF資訊即可. 所謂SDF(Signed-distance-field),就是將每個畫素儲存的顏色值換

基於OpenGL編寫一個簡易的2D渲染框架-04 繪制圖片

著色器 drawtext 結構 渲染 images ron renderer make 制圖 閱讀文章前需要了解的知識,紋理:https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/  

基於OpenGL編寫一個簡易的2D渲染框架-05 渲染文本

new 坐標 false 證明 ont 獲取 simple 了解 param 閱讀文章前需要了解的知識:文本渲染 https://learnopengl-cn.github.io/06%20In%20Practice/02%20Text%20Rendering/ 簡要步