【GDC2016】Lighting The City of Glass - Rendering 「Mirror『s Edge Catalyst」

GDC2016的重度分享,講述MIRRORS EDGE(鏡之邊緣)的渲染。演講者是來自EA DICE的燈光師(lighting artist)


整個遊戲的場景有兩個大特點:

  1. 場景設定為現代化辦公樓群
  2. Lighting是渲染中最重要的部分


早期(2008年)版本的Mirrors Edge使用的Lighting Tech

遊戲中的lighting是static的,使用了UE3的Beast作為烘焙器,烘焙的特性:

  1. 烘焙直接光
  2. 烘焙間接光
  3. 高精度:1pixel / 1cm
  4. 烘焙方向信息(可以更好的顯示normal map的信息)
  5. 每個level需要50台機器烘焙25個小時

Game design

作為一個沙盒設計、自由探索的世界,遊戲設計的目標是讓玩家可以感受到日夜變化、生動、巨大的世界:

融入世界觀、故事性:


Challenges

比較挑戰的事情包括:

  1. 24小時系統
  2. 動態光源的使用
  3. 電影級角色
  4. 使用pbr渲染風格化的畫面

Physically Based Rendering

EA的寒霜引擎2014年開始使用PBR,主要使用的技術點:

  1. specular使用基於Microfacet model的GGX
  2. diffuse使用修正過能量守恆的Disney Diffuse

這些都已經是工業界的標準做法,貼圖比較方便使用第三方軟體(比如使用substance)進行製作。

這裡主要是製作四種貼圖:

  • base color 一般在40-230之間
  • smoothness 美術來自由調整
  • reflectance 用來控制fresnel
  • metal mask 區分金屬和非金屬

使用pbr也有助於實現時間變化。因為遵守物理,所以在不同的光照條件下,都能表現出比較自然的光照結果。

Camera也要考慮基於物理的屬性,比如相機中常見的屬性:

  1. Shutter Speed
  2. Aperture
  3. ISO
  4. DOF

東京採風

建築結構:

各種廣告牌、以及一些建築外立面上的物件:

各種屋頂:

各類白色(用於建立顏色參照表):

各種光源環境:

定時拍攝時間變化(現場展示的是一個時間變化的視頻):

採集HDR Probe:

在製作物件時,使用這些不同環境的Probe預覽物件在不同的環境下的表現:

在遊戲中使用上述採集的靜態的HDR sky是比較難的:

  1. 24小時變化需要大量的skies
  2. 需要大量的內存、streaming
  3. HDR skies之間做過渡時太明顯
  4. 雲需要高精度
  5. 雲需要打光

這裡sky的渲染方案是基於物理進行動態的計算。


Physically Based Sky

通過Precomputed atmospheric scattering,然後加上一些調節係數模擬天空的渲染:

  1. Rayleigh scattering的強度、高度
  2. Mie scattering的強度、高度
  3. Ozone Percentage
  4. 光源設置
  5. 多光源

霧的調節(霧也是一種大氣現象):

基於高度、濃度、濃度上限、顏色疊加或乘積等係數來實現霧效:

雲層的光照,定義了雲的Alpha、Absorbtion、Thickness值來做光照的計算:

整個天空和雲的計算在console大概用了0.75ms(比靜態天空高了0.35ms)。

美術有時候想要非常藍的天空:

通過調整散射係數來做:

Rayleigh scattering/2:

直接使用天空的散射公式計算Mie散射,沒辦法滿足建築遮擋的情況:

最後,Mie散射使用Light Shaft計算來模擬。


Creating a Day Cycle

要做的事情包括:

  1. 太陽、月亮、星星的升降
  2. 24小時(實際時間為48min)時間變化、非線性調節(比如日出的時間被放大)
  3. 不同時間段不同的Bloom、Sun size、Camera exposure調節
  4. 可以在某些任務時限定時間點
  5. 站立不動時,sun shadow是停止變化的(防止陰影抖)


Global Illumination

怎麼根據24小時變化的天空實現GI,從:

渲染出:

使用了Geomerics的Enlighten作為烘焙器,整個城市大概需要7個小時做precompute。經過precompute之後可以做很快速的relighting。

為了Streaming,將整個城市的烘焙區域劃分為3個層級的結構:

  1. 17 Ground level zones
  2. 83 Buildings zones
  3. 391 Props zones

每個streaming zone的數據包括:

  1. 1套lightmap,最高2048;給較大的靜態物體使用
  2. lightprobe;給動態物體和小物體使用
  3. GI Data;給relighting使用

一個streaming zone的數據大概5~15MB。在內存中,大概同時有30套數據。

在時間變化過程中,需要在CPU中基於precompute的數據持續計算後續將要用到的GI信息(relighting),預算是3ms每幀。內存中大概會有三種狀態的GI信息:

  1. 當前的
  2. blend to的
  3. 計算中的


美術控制(Artistic Control)

Enlighten默認會生成32*32的cubemap:

美術可以基於cubemap增加強度、顏色係數控制。對於夜晚場景:

可以增加cubemap中月光區域的亮度:

太陽光的彈射率被設置為75%(比實際中高):

光照信息圖:

相對於2008年的1pixel/1cm,目前GI使用的精度幾乎是1pixel/1m(一個格子是一個pixel):

這個GI烘焙方案有很多限制:

  1. 只烘焙間接光部分,不適用於直接光
  2. 過低的精度,無法存儲AO信息
  3. lightprobe只能達到per-object級別

我們必須通過其他方式來彌補GI精度的不足,這裡的解決方案是使用反射。


Reflections


Distant Reflection Volume

反射分為很多level,最遠一級叫做DRV(Distant Reflection Volume),使用的傳統的cubemap:

特性包括:

  1. 根據玩家位置變化
  2. 精度256*256
  3. 隨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有一些要處理的問題:

  1. 一些opaque lines會阻擋ray trace,可以不寫深度
  2. 透明物體不反射

Local Planar Reflections

最後一級反射是Local Planar Reflections。比如鏡面反射:


Getting the right white

白天最初的太陽光照強度、Camera曝光係數為:

  1. Sun :100000LUX
  2. EV 12.6(Overexposed by 1.8 EV)

晚上最初的太陽光照強度、Camera曝光係數為:

  1. Sun :100000LUX
  2. EV -0.35(overexposed by 1.5 EV)

日出最初採用的光照強度、Camera曝光係數為:

  1. Sun :100000LUX
  2. EV 5.7(overexposed by 1.8 EV)

會顯得local光的比例不足:

日出重新調整後的參數:

  1. Sun :1000LUX
  2. EV 0.45(overexposed by 1.8 EV)

另外,這裡發現,採樣太陽光強度為1000LUX,加上調整EV值,可以得到100000LUX下相似的效果:

  1. Sun:1000 LUX
  2. EV 6(overexposed by 1.8 EV)

  1. Sun:100000 LUX
  2. 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的陰影計算:

  1. 同時最多計算8個光的陰影
  2. 陰影計算會進行cache
  3. 陰影切換的時候做平滑過渡

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:計算機圖形學 |