[WebGL] three.js 學習筆記 #2 - 初見PBR
初淺地研究,嘗試自行撰寫 Physically Based Rendering shader。目前 javascript 用的還不是很習慣,非同步與事件順序常常會轉不過來,但 WebGL 作為一個練習寫 shader 的環境來說還是相對方便的。
主要資料
PBR shadering 是近年來逐漸熱門的材質與光照處理技術,比起 Phong model 有了更多物理根據,也更加真實。
這次練習的 PBR shadering 實作是根據 Epic 團隊在 UE4 上分享的技術講座:
Real Shading in Unreal Engine 4
by Brian Karis, Epic Games
而這篇文章又大量引用了另一篇迪士尼的技術文章,沿用了不少數學模型。
Physically-Based Shading at Disney
by Brent Burley, Walt Disney Animation Studios
基本的理解
PBR 將所有的光線反射分成 Diffuse 與 Specular,其中 Specular 更有著數種 BRDF 模型可以選擇,各有優缺點。
依照來源,光線又分成有特定光源的直接光照,以及來自環境的間接光照,故綜合起來 PBR 的 light model 可以分成四個部分:
- Direct Diffuse
- Direct Specular
- Indirect Diffuse
- Indirect Specular
而材質上,主要有 roughness 及 metallic,分別代表粗糙度以及金屬性質,皆會影響 Diffuse 與 Specular 的顏色及比例強度。
Direct Diffuse
Direct Diffuse 是物體外型呈現的基本陰影,Epic 文章中採用了 Burley Diffuse 模型:
Burley Diffuse 光照(日本語)
Direct Specular
Direct Specular 是來自特定光源的高光反射,一般來說會採用 BRDF 理論,但又會視情況在細部上選擇不同的模型。這裡我找到了一篇列出不少模型方程式的文章:
Specular BRDF Reference
Indirect Diffuse & Specular
Indirect lighting 是指環境上接收了主光源後,二次反射的結果。可以想像一下 “太陽-月亮-水面月影” 三者關係,其中水面月影便是 Indirect lighting 的結果。
Indirect lighting 的兩個項目會影響材質呈現上的細節,雖然只是細節,卻是令 PBR 材質特別真實的靈魂所在。
基本的原理,是將周圍環境預先處理成 CubeMap,而對於要物體上的一點,這張 CubeMap 上的每個像素都相當於一個微弱的小型光源,而將整個 CubeMap 的發光結果全部映照到物體上,就是 Indirect Lighting 演算法的目標。
為了加速這演算過程,Epic 團隊用數張貼圖來代表 precompute 資料以及近似,來得到時間成本上合理的結果,Epic 原文不易理解的部分可以參考這篇文章輔助:
Indirect Lighting for PBR
PBR 中間步驟與結果
Diffuse
Specular
Indirect Diffuse
還沒有找到相關貼圖,所以這邊目前被我跳過了。
Indirect Specular
加總後的結果
恩…覺得還有待加強…
其他參考連結
- Unreal 文件 Physically Based Materials -
https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/PhysicallyBased/ - PBR Algorithms for Unity -
http://www.jordanstevenstechart.com/physically-based-rendering - DONTNOD Physically based rendering chart for Unreal Engine 4
https://seblagarde.wordpress.com/2014/04/14/dontnod-physically-based-rendering-chart-for-unreal-engine-4/ - DONTNOD specular and glossiness chart
https://seblagarde.wordpress.com/2012/04/30/dontnod-specular-and-glossiness-chart/