【GDC2016】Lighting The City of Glass - Rendering 「Mirror『s Edge Catalyst」
GDC2016的重度分享,講述MIRRORS EDGE(鏡之邊緣)的渲染。演講者是來自EA DICE的燈光師(lighting artist)
整個遊戲的場景有兩個大特點:
- 場景設定為現代化辦公樓群
- Lighting是渲染中最重要的部分
早期(2008年)版本的Mirrors Edge使用的Lighting Tech
遊戲中的lighting是static的,使用了UE3的Beast作為烘焙器,烘焙的特性:
- 烘焙直接光
- 烘焙間接光
- 高精度:1pixel / 1cm
- 烘焙方向信息(可以更好的顯示normal map的信息)
- 每個level需要50台機器烘焙25個小時
Game design
作為一個沙盒設計、自由探索的世界,遊戲設計的目標是讓玩家可以感受到日夜變化、生動、巨大的世界:
融入世界觀、故事性:
Challenges
比較挑戰的事情包括:
- 24小時系統
- 動態光源的使用
- 電影級角色
- 使用pbr渲染風格化的畫面
Physically Based Rendering
EA的寒霜引擎2014年開始使用PBR,主要使用的技術點:
- specular使用基於Microfacet model的GGX
- diffuse使用修正過能量守恆的Disney Diffuse
這些都已經是工業界的標準做法,貼圖比較方便使用第三方軟體(比如使用substance)進行製作。
這裡主要是製作四種貼圖:
- base color 一般在40-230之間
- smoothness 美術來自由調整
- reflectance 用來控制fresnel
- metal mask 區分金屬和非金屬
使用pbr也有助於實現時間變化。因為遵守物理,所以在不同的光照條件下,都能表現出比較自然的光照結果。
Camera也要考慮基於物理的屬性,比如相機中常見的屬性:
- Shutter Speed
- Aperture
- ISO
- DOF
東京採風
建築結構:
各種廣告牌、以及一些建築外立面上的物件:
各種屋頂:
各類白色(用於建立顏色參照表):
各種光源環境:
定時拍攝時間變化(現場展示的是一個時間變化的視頻):
採集HDR Probe:
在製作物件時,使用這些不同環境的Probe預覽物件在不同的環境下的表現:
在遊戲中使用上述採集的靜態的HDR sky是比較難的:
- 24小時變化需要大量的skies
- 需要大量的內存、streaming
- HDR skies之間做過渡時太明顯
- 雲需要高精度
- 雲需要打光
這裡sky的渲染方案是基於物理進行動態的計算。
Physically Based Sky
通過Precomputed atmospheric scattering,然後加上一些調節係數模擬天空的渲染:
- Rayleigh scattering的強度、高度
- Mie scattering的強度、高度
- Ozone Percentage
- 光源設置
- 多光源
霧的調節(霧也是一種大氣現象):
基於高度、濃度、濃度上限、顏色疊加或乘積等係數來實現霧效:
雲層的光照,定義了雲的Alpha、Absorbtion、Thickness值來做光照的計算:
整個天空和雲的計算在console大概用了0.75ms(比靜態天空高了0.35ms)。
美術有時候想要非常藍的天空:
通過調整散射係數來做:
Rayleigh scattering/2:
直接使用天空的散射公式計算Mie散射,沒辦法滿足建築遮擋的情況:
最後,Mie散射使用Light Shaft計算來模擬。
Creating a Day Cycle
要做的事情包括:
- 太陽、月亮、星星的升降
- 24小時(實際時間為48min)時間變化、非線性調節(比如日出的時間被放大)
- 不同時間段不同的Bloom、Sun size、Camera exposure調節
- 可以在某些任務時限定時間點
- 站立不動時,sun shadow是停止變化的(防止陰影抖)
Global Illumination
怎麼根據24小時變化的天空實現GI,從:
渲染出:
使用了Geomerics的Enlighten作為烘焙器,整個城市大概需要7個小時做precompute。經過precompute之後可以做很快速的relighting。
為了Streaming,將整個城市的烘焙區域劃分為3個層級的結構:
- 17 Ground level zones
- 83 Buildings zones
- 391 Props zones
每個streaming zone的數據包括:
- 1套lightmap,最高2048;給較大的靜態物體使用
- lightprobe;給動態物體和小物體使用
- GI Data;給relighting使用
一個streaming zone的數據大概5~15MB。在內存中,大概同時有30套數據。
在時間變化過程中,需要在CPU中基於precompute的數據持續計算後續將要用到的GI信息(relighting),預算是3ms每幀。內存中大概會有三種狀態的GI信息:
- 當前的
- blend to的
- 計算中的
美術控制(Artistic Control)
Enlighten默認會生成32*32的cubemap:
美術可以基於cubemap增加強度、顏色係數控制。對於夜晚場景:
可以增加cubemap中月光區域的亮度:
太陽光的彈射率被設置為75%(比實際中高):
光照信息圖:
相對於2008年的1pixel/1cm,目前GI使用的精度幾乎是1pixel/1m(一個格子是一個pixel):
這個GI烘焙方案有很多限制:
- 只烘焙間接光部分,不適用於直接光
- 過低的精度,無法存儲AO信息
- lightprobe只能達到per-object級別
我們必須通過其他方式來彌補GI精度的不足,這裡的解決方案是使用反射。
Reflections
Distant Reflection Volume
反射分為很多level,最遠一級叫做DRV(Distant Reflection Volume),使用的傳統的cubemap:
特性包括:
- 根據玩家位置變化
- 精度256*256
- 隨24小時時間變化
缺點是不夠精確。比如一個直接使用DRV的玻璃牆建築的反射效果:
會發現很多看不到天空的位置也反射了天空的信息,需要為DRV生成反射遮擋信息,Sky Visibility Mask,這個信息是由Enlighten生成的。Sky Visibility Mask適用於白天,對於晚上來說,需要考慮來自街道的反射。所以這個mask信息在晚上使用會經過特殊的對比度曲線處理。
Local Reflection Volume
再低一級的反射level叫做LRV(Local Reflection Volume)
使用的是parallax-corrected cubemap。對一個cubemap的影響區域,需要根據區域來進行cubemap的影響範圍劃分,比如圖中綠色的區域都不受室內的cubemap影響:
也會根據normal、face進行cubemap影響的權重過渡,硬過渡:
根據normal過渡:
cubemap並不是很cheap的,使用了單獨一次light來進行計算。
LRV使用的cubemap也會隨著時間變化不停的重新生成。
更近一級的反射叫做SSR(Screen Space Reflection)
使用Raytrace、基於Depth buffer、粗糙度(粗糙部分要進行blur sample)進行反射計算。No SSR:
SSR:
可以根據粗糙度和World Normal進行優化,天花板部分、過於粗糙部分不做反射計算:
另外,反射計算可以像shadow計算一樣是一個非同步的過程。對於SSR有一些要處理的問題:
- 一些opaque lines會阻擋ray trace,可以不寫深度
- 透明物體不反射
Local Planar Reflections
最後一級反射是Local Planar Reflections。比如鏡面反射:
Getting the right white
白天最初的太陽光照強度、Camera曝光係數為:
- Sun :100000LUX
- EV 12.6(Overexposed by 1.8 EV)
晚上最初的太陽光照強度、Camera曝光係數為:
- Sun :100000LUX
- EV -0.35(overexposed by 1.5 EV)
日出最初採用的光照強度、Camera曝光係數為:
- Sun :100000LUX
- EV 5.7(overexposed by 1.8 EV)
會顯得local光的比例不足:
日出重新調整後的參數:
- Sun :1000LUX
- EV 0.45(overexposed by 1.8 EV)
另外,這裡發現,採樣太陽光強度為1000LUX,加上調整EV值,可以得到100000LUX下相似的效果:
- Sun:1000 LUX
- EV 6(overexposed by 1.8 EV)
- Sun:100000 LUX
- EV 12.6(overexposed by 1.8 EV)
在有些情況下,使用100000 LUX的太陽光強度會導致如下現象:
這是由於camera感知的光照強度範圍相對於人眼要有限的多,這裡用正常camera的曝光方式,光照特彆強的部分完全爆掉了,但是真實世界中,人眼是能夠看到亮部的細節的。這裡處理方式是使用1000 LUX的太陽光強度:
所以,最終遊戲中使用了1000 LUX的太陽光強度(100000是PBR的)。
在曝光計算中,另外一個比較重要的是Tone Mapping,即從HDR空間轉化到Image的LDR空間。直接使用sRGB曲線的效果:
使用現在Game常用的Filmic曲線,對比度偏弱:
基於Filmic做了修改,得到的效果:
另外,提供給美術color grading的方式可以進一步對顏色、對比度進行調整:
Local Lighting
local lighting的光照也是基於物理的:
- 希望使用Lumens或者Candelas作為光照強度
- 使用真實的衰減係數
- 色溫值
- IES photometric 基於真實世界中的光照強度分布(或衰減)
- 區域光
存在的問題:
- 無法使用真實世界中的光照強度:
由於真實世界中的光源有很多屬性無法模擬,所以無法直接使用真實世界中的光照強度值。最後採樣的方式是,設置好camera的曝光參數,然後調整光源的強度到合適的值。
另外,通過一些參數可以讓美術更好的控制光照的表現:
- 衰減控制
- 強度clip
另外,對於這些光源的彈射,可以設置彈射比例和顏色傾向,以取得更好的彈射效果:
這些光源採用tile base的渲染方法,每幀的預算是3.3ms:
local light的陰影計算:
- 同時最多計算8個光的陰影
- 陰影計算會進行cache
- 陰影切換的時候做平滑過渡
Image Stylization
Post Effects
Bloom
Raw:
Bloom:
不同的顏色有不同的blur權重:
可以調節垂直或者水平方向的bloom:
bloom的結果可以再乘上貼圖信息,出一些特殊效果。還針對bloom實現了Lens reflection效果(屏幕上有一些bloom對應的暈光)。
Simple Volumetrics
基於Volume Sphere的Color Shift,可以營造局部的顏色氛圍效果:
廣告牌效果
廣告牌顯示的內容是變化的(video),這就要求產生的光效、以及對周圍的影響是動態變化的:
根據每幀video的畫面,能夠得到一個平均顏色,然後基於這個顏色,可以使用Simple Volumetrics對周圍產生光照影響。
Cinematics
Characters
基於人臉掃描,生成模型、貼圖信息
做一定的修改,做風格化處理,得到的數據和渲染效果:
實現SSS效果:
Eye shader,通過Parallax和不同的normal實現虹膜和角膜的視差。
頭髮的各向異性:
網易遊戲招聘(應屆生、實習、社招)
求賢若渴招: 1.技術美術(TA) 2. 引擎程序 3. 邏輯開發感興趣直接加本人微信:warmsuning 或發送簡歷: hzliyangyang@corp.netease.com
推薦閱讀:
※用頂點Shader實現的實時陰影
※【GDC2013】Sand Rendering in Journey
※走樣與反走樣(Aliasing/Anti-Aliasing):Graphics Cases
※為什麼需要模擬HDR
※[StrangeLoop 2017] How to Hack a Painting
TAG:計算機圖形學 |