【GDC2016】Physically Based Sky, Atmosphere and Cloud Rendering in Frostbite

這個Talk有兩個資源,一個PPT,一個PDF。這裡主要描述PPT里的內容。在這個Talk描述了寒霜引擎的大氣散射、雲、天空的渲染。


在開始談具體的論文內容之前,讓我們聊聊,作為遊戲渲染,要做的事情有那些呢:

  1. 角色
      1. 皮膚
        1. 要看起來像皮膚
      2. 表情
        1. 傳神
      3. 眼睛
        1. 材質表現
        2. 眼神
    1. 頭髮
      1. 髮型設計
      2. 髮絲表現
      3. 高光表現
    2. 服裝
      1. 服裝設計
      2. 質感表現
    3. 布料表現
      1. 絲滑
    4. 動作
  2. 場景
    1. 材質
      1. 材質表現力和性能平衡
      2. 各類特殊材質表現
    2. 光與影
      1. 烘焙
        1. 精度和性能平衡
        2. 烘焙演算法選擇
        3. 烘焙器選擇
      2. probe
    3. 地表
      1. 地表材質
        1. 豐富度
          1. 幾張混合
        2. 效果
          1. 是否使用高度信息融合
          2. 材質演算法選擇
      2. 形體表現力
        1. Worldmachine的使用
        2. 創建自動度、易用性
        3. 石頭Mesh or Terrain System
    4. 大氣和天空
      1. 大氣散射
        1. 高度霧
        2. 距離霧
        3. 散射現象模擬
        1. 雲移動
        2. 雲變形
        3. 雲受光
      2. god rays
    5. 視野
      1. 近中遠層次構景設計
      2. 超遠視距支持
    6. 布景元素
      1. 水、海、河流
        1. 材質效果
        2. 形體變化
      2. 貼花
      3. 道路系統
    7. 天氣系統
      1. 下雨下雪
        1. 濕潤表現
        2. 雨水表現
      2. 風力
      3. 日夜變化
    8. 植被系統
      1. 茂密程度
        1. 大片森林
        2. 花海草海
      2. 植被搖擺
      3. 植被光影
  3. 後處理
    1. AA
    2. bloom
    3. color grading
    4. 景深
    5. 等等很多

看起來很多,所以做引擎的也很忙的。而天空、大氣散射、雲我認為是對於構景來說非常重要的一部分。當你做好了它們,玩家進來遊戲10分鐘後(前10分鐘選人界面玩角色)會說:畫質好(次世代)!(當然其他的也不能差)


其實寒霜引擎在2014年,才正式全面轉向PBR,PBR讓寒霜引擎的表現力得到了大大的提升:

照片和引擎渲染效果對比

從上面圖片看,已經很難一眼辨別出真實與虛擬的區別了。

之前,在寒霜引擎里,對於天空、大氣、雲渲染主要使用的相關技術包括:

  1. 天空
    1. HDRI(高動態圖)
    2. color gradients(比如散射模擬圖)
  2. 大氣效果
    1. 基於深度的霧效
    2. 屏幕空間的Light Shaft
    1. 貼圖雲
    2. 模擬移動
    3. 移動的多層片雲

這些技術效果還是不錯的,效果圖:

但是這些技術很難實現動態的24小時變化。

一個很具有代表效果的照片:

目標就是實現照片中的效果,並且能實現24小時和天氣變化。

具體的目標:

  1. 動態24小時、天氣變化
  2. 基於物理
    1. 具有意義的調節參數
    2. 材質和光照分離
  3. 統一的交互影響
    1. 天空、大氣、雲互相影響
    2. 和透明、不透明、GI正確交互
  4. 60FPS

下面是Mirror』s Edge Catalyst實現的效果:

https://www.zhihu.com/video/951568992431734784

可以看到,場景的所有東西之間是互相影響的。

Bioware 實現的效果:

https://www.zhihu.com/video/951569562622304256


進入正題,這裡將相關渲染分為四個部分(注意標記顏色的對應關係):

值得注意的是,大氣效果是畫面中的任何一處都有的。大氣效果包含我們通常理解的霧效。

分析一下相關的物理知識:

  • 大氣層

Rayleigh Scattering(注意傳播時的顏色變化):

Mie Scattering:

幾類主要的相關的工作介紹:

  • Analytical models
  1. An Analytic Model for Full Spectral Sky-Dome Radiance, SIGGRAPH 2012
  2. Spatial distribution of Daylight
  3. A Practical Analytic Model for Daylight, SIGGRAPH 99.

效果(An Analytic Model for Full Spectral Sky-Dome Radiance):

  • Spectral rendering
  1. Rendering Parametrizable Planetary Atmospheres with Multiple Scattering in Real-time, CESCG 2009
  2. A Practical Analytic Model for Daylight, SIGGRAPH 99.
  • Sky atmosphere simulation
  1. Precomputed Atmospheric scattering, EGSR 2008

效果:

寒霜的實現主要基於(Precomputed Atmospheric scattering, EGSR 2008)提出的方法。


LUT

本文介紹的渲染方法中使用了LUT來提升散射計算效率,首先介紹一下LUT是如何計算的,基於下圖中的 L (Light)、 h (height)、 	heta{v}	heta{l}

來計算出LUT:

來看一下散射的主要係數:

  • Scattering係數(不同波長的光波係數不同)表示有多少光被彈射掉
  • Extinction係數表示在被吸收、彈射掉之後有多少光繼續傳播
  • Distribution係數表示光在穿過空氣粒子時的散射分布
  • Ozone用來在日落時使用,保持天空藍色屬性

天空渲染

使用LUT直接渲染出遠處天空:

近處天空,Aerial perspective計算:採用Volumes的方式渲染,將視錐劃分為32x32x16的slices,對每個slice進行獨立計算,然後進行求和。

效果:

看一下,太陽位置變化時的效果:

https://www.zhihu.com/video/951597462956302336

在太陽位置變化時,天空和Aerial perspective的渲染效果會自動變化。另外,當太陽位置變化中,為了保持整個遊戲的光照環境一致,需要對場景中其他渲染使用的數據做相應的變化,包括:

  1. Sky environment map
  2. Local reflection volumes
  3. Global illumination

當大氣屬性參數變化時(比如氣候、天氣、空氣狀況發生變化),LUT做對應的更新。遊戲中,LUT是根據大氣屬性參數進行實時計算出來的,開銷比較高,一般是分幀來計算:


太陽渲染

美術指定太陽在頂點時的光照度,當太陽在不同位置時,計算對應的光照度 E

當有了光照度 E ,就可以畫出一個基本的太陽:

應用之前討論的散射(LUT)計算:


雲的渲染

相關的工作:

  • Mesh+ HyperTexture 效果好性能差:

  • Splatting based rendering 基於粒子渲染、效果比較局限,某些情況下才比較好看:

  • Cloud layer 動態生成 支持光照、陰影、天氣:

本文基於上圖中的方法(Physically Based and Unifier Volumetric Rendering in Frostbite, SIGGRAPH 2015.)做了以下幾點改進:

  1. 能量守恆
  2. 2-lobe phase function
  3. 24小時、天氣變化、以及與天空和Aerial perspective交互

拆解一下雲幾個主要的計算部分:

  • Transmittance 雲的傳播屬性(類似於透明度)。效果上就是在雲邊緣是半透的;從光線傳播上來說,就是天空的光透過雲射入了攝像機

  • Ambient(來自四面八方的光,即環境光,射到雲上並彈射到攝像機)

  • Sun scattering(太陽主光在雲層彈射後,進入攝像機的光)

  • Self shadow (考慮太陽主光彈射受自陰影影響)

  • Phase function(光在穿過粒子時,彈射的分布函數)

這裡沒有考慮的是,光在雲內的多次彈射。


做Transmittance和Scattering計算,需要使用Raymarch演算法,使用的演算法基於(Physically

Based and Unifier Volumetric Rendering in Frostbite, SIGGRAPH 2015),做了一些優化:shadertoy demo,具體效果:

從結果來看,優化後的演算法,在21 samples已經可以達到比較好的效果。


接下來,談談Phase function。一個比較標準的效果如圖所示:

使用一種簡化的模擬實現:

效果:


使用Aerial perspective渲染雲,首先看一下沒有使用Aerial perspective的效果:

https://www.zhihu.com/video/951933976231759872

出現的問題是,雲與整個環境不夠融合,不受霧:

使用Aerial perspective後:

https://www.zhihu.com/video/951934587497144320

當雲的覆蓋率越來越高時,AP(Aerial perspective)會受到影響的。在AP計算時,必須考慮雲的覆蓋率。

這裡,對環境(雲覆蓋率)採樣,得到半球函數:

得到的結果:

https://www.zhihu.com/video/951937677654736896

從視頻可以看出,當雲慢慢布滿天空時,Mie散射的顏色慢慢由暖黃色(太陽產生)變成了深藍色(變成主要受穿過雲層的光影響)。

性能報告,看起來還挺省的(畢竟是遊戲機):

OK,講完了,進入廣告時間:

網易遊戲招聘(應屆生、實習、社招)

求賢若渴招: 1.技術美術(TA) 2. 引擎程序 3. 邏輯開發

感興趣直接加本人微信:warmsuning 或發送簡歷: hzliyangyang@corp.netease.com

推薦閱讀:

讓角色半透明:後期模糊(二)
【GDC2013】Sand Rendering in Journey
Ray Marching Ocean
GAN在2017年實現四大突破,未來可能對計算機圖形學產生衝擊
Unity3D如何將圖片以正確的像素顯示在屏幕上

TAG:計算機圖形學 |