遊戲中的Volumetric Rendering

2021-01-14 南研所菲爾茲實驗室

1. 一些理論知識

快速簡要地介紹一些理論知識.

光打到粒子上之後的效果:


光在介質上的散射,入射光分為吸收,透射,外散射三個部分,根據能量守恆,入射光等於三項的和

當不考慮中間介質時候,攝影機中得到的顏色就是最近的點上出射光的顏色

不考慮散射


考慮散射時,情況就比較複雜了:

光的散射


內散射會使路徑上的光增多,外散射會使路徑上的光變少.通常情況下,為了計算方便,不考慮多次散射的光.

模擬真實光穿透介質的比例的函數:


不同的散射類型:

Mie散射和Rayleigh散射


Rayleigh散射模型用來描述較小的粒子的散射,比如空氣粒子的散射使天空變藍. Mie散射模型是用來描述較大粒子的散射,比如灰塵.

Phase Function 是用來描述光在不同方向的散射分布的函數,根據能量守恆,光在所有方向散射的和總是1


Henyey–Greenstein Phase Function 是一個經常用來描述Mie散射的Phase Function


2. DepthFog

在每個像素計算的正常顏色基礎上,根據距離混合一個霧的顏色.

最常用的三種計算霧強度的公式:

Linear : factor = (end-z)/(end-start)

Exp: factor = exp(-density*z)

Exp2: factor = exp(-(density*z)^2)

unity中的全局霧設置和宏APPLY_FOG就是使用這種方式

unity中的全局霧設置


早期的Opengl和DirectX甚至提供的類似的API接口(glFog 等),在硬體級別實現霧效.

3. PostProcessing Fog

和Depth Fog基本上是一樣的,區別在於PostProcessing 的Fog通過在PostProcessing時根據depth texture反推計算出攝影機到目標像素點的距離.

除了用距離做參數,還可以根據高度作為參數,或者高度*距離這樣的形式來作為參數.

4. 粒子/BillBoard

在需要霧效的位置使用大量的粒子或者BillBoard來模擬光散射效果或者霧效.很顯然,這種方式很可能造成一些OverDraw性能問題,以及需要特定的觀察角度,而且不能隨光照變化.


5. Sun Shaft

也叫God Ray,通過PostProcessing來實現.GPU Gems 3 13.3中詳細描述了這種方法的實現.

原理是在PostProcessing時,將遊戲界面中的太陽以太陽為中心向外做一個Vector Blur + Bloom,再進行疊加,產生太陽光向外發散的感覺.當然了,這種方式只有太陽出現在畫面中的時候才有效果.


UE4中的Light Shafts包含兩種模式Light Shaft Occlusion和Light Shaft Bloom,後者就是上面所說的方式,前者則是將太陽周圍的暗部拉伸,產生遮擋的效果,原理是類似的.

UE4中的Light Shaft設置


Unity早期的Image Effects中,也有Sun Shaft效果組件.

6. RayMarching

使用PostProcessing和RayMarching來實現,GPU PRO5裡有一篇文章Volumetric Light Effects in Killzone Shadow Fall by Nathan Vos詳細介紹了這種方法.

基本原理是在pre-z得到場景Depth Buffer以及光照的Shadow Map後,確定一個要進行Volume Light的區域(點光源球形,錐形光錐形,直線光是全屏的),RayMarching計算出一個Volume Light的Buffer,計算光照效果時應用效果.

生成Volume Rendering Buffer的過程其實就是在Volume Redering區域中進行RayMarching,為了降低Artfict,通常會使用一個Dither Texture進行抖動,並且在最後對結果進行Blur,得到平滑的結果.


有一個Unity的Volume Lighting的Demo是這種方式來實現的, https://github.com/SlightlyMad/VolumetricLights.

7. Volume Texture

使用Volume Texture來保存空間中的散射信息,是真正意義上的Volume Rendering.

一個詳細描述了實現方法的文章: https://www.ea.com/frostbite/new ... ering-in-frostbite.

一個簡單的Volume Texture實現的Volume Rendering的過程:

1.劃分VolumeTexture的區域,這裡將攝影機視錐內的部分作為Volume Texture區域,沿著垂直於攝影機方向的平面切分.為了較好的性能,將3DTexture的大小弄的小一點,比如180x60x64.

沿著攝影機方向垂直切分


2.渲染光源的Depth Map,為了減少大量PCF陰影的性能消耗,這裡用ESM陰影,並進行DownSample.

3.使用Computer Shader,向Volume Texture中寫入空間中點的光照信息,光照包含空間環境光,光源光照,求和後寫入到Texture RGB通道中.空間點的散射強度值,寫入到Texture A通道中.

4.使用Computer Shader,從攝影機方向向外進行RayMarching,使用前面提到的模擬散射穿透計算的公式,累加光照.


5.渲染某個點時,在VolumeTexture中查找相應點的散射光照值,進行計算.

UE4中的VolumeRendeing就是這種方法.而且UE4還進行了升級,支持將Volume Lighting烘培到LightMass中.新版的UE4還有Volume Material和3DTexture導入,可以方便地實現各種效果.

Unity的HDRP同樣是這種方式渲染.Unity官方以前的宣傳片Adam,同樣是這種方法,可以參考:https://github.com/Unity-Technologies/VolumetricLighting


相關焦點

  • [sig16]《神秘海域4》中的volumetric-based materials
    ==項目經驗和心路歷程==實際在我接觸到的大部分開發者眼裡,大家會覺得naughty dog這樣的引領業界的公司,一定是從「一個英明決策到另一個英明決策」,然後砍瓜切菜般一A到底的把牛逼遊戲做出來。實際上作者在本文中也反覆提及,中間走了不少彎路,有錯誤的預判,有失敗的嘗試,中間一度感到失去希望,還在團隊確實牛逼,彼此也非常暖心的互奶,作品出來之後,還是叫好叫座的。最後也是意識到again做一個demo和一個需要任何時候都好看,都高幀數不卡頓的遊戲是非常不同的。so this is the reality.
  • 8i將在CES大會上發布「Volumetric VR」播發器,適配HTC Vive和Oculus Rift
    該公司專精於Volumetric 3D捕捉技術,可以將活動物體通過該技術投影到一個可以移動變換視角的3D虛擬實境空間中。這也就意味著一旦一個人被捕捉投映到VR中去後,我們可以走近他乃至繞著圈打量他;而這就是真正的360度運動3Dvolumetric視頻。這次所展示的內容和六個月前有天壤之別,上次還只能順利捕捉部分內容。
  • 把真人放進VR,3dMD的Volumetric capture技術在這裡做了哪些貢獻?
    隨著沉浸式技術的發展,全容積捕獲(full volumetric capture)被認識是當前VR 1.0領域佔主流的球形360視頻形式的一個關鍵的下一代技術。它從根本上改變了我們視覺內容創作的方式,帶來了從固定視角體驗到自由視角體驗的轉換。目前已經有許多技術團隊在研究空間捕捉技術,可以捕捉真人的表情,呈現在虛擬形象上,但仍局限在局部捕捉和卡通形象呈現。
  • Unity 2020.2 優化了 Time.deltaTime,以實現更流暢的遊戲體驗
    Unity 2020.2 已經開發下載,新版本中,我們修復了許多開發平臺的通病:不連貫的Time.deltaTime。它造成了遊戲中的運動會出現顫動、抖動的現象。在本文中,我們將介紹背後原因,以及新版Unity中推出的解決方案。  自電子遊戲出現以來,對流暢運動的追求從未停止。
  • Oculus 揭秘 VR 中的 Volumetric Sounds 技術(二)
    然而,在現實世界中,並不是所有的聲音都來自於空間中的某一點,有時候你希望的聲音來自於更大的發聲空間。當聽眾附近有一個較大的物體或對象時,這一點尤其如此。在這些情況下,使用點源可能聽起來不那麼自然,就像聲音只來自對象的中心。工作環境有一些辦法可以解決點源問題,但各有自己的優點和缺點。
  • 新方法在小鼠和斑馬魚腦中實現高速體積動態成像
    新方法在小鼠和斑馬魚腦中實現高速體積動態成像 作者:小柯機器人 發布時間:2020/8/13 16:43:16 近日,中國科學院神經科學研究所王凱團隊利用共聚焦光場顯微鏡在小鼠和斑馬魚腦中實現高速體積動態成像
  • 我玩遊戲or遊戲玩我?淺談遊戲中的Meta元素
    有一種說法是「元小說是關於小說的小說,那么元遊戲就是關於遊戲的遊戲」。這種說法我不完全認同,在我看來「元」更貼切的意思是:高於、超出。所以遊戲中的Meta元素就是:高於、超出遊戲本身的內容。這樣說可能太籠統了,所以我就舉幾個例子艾希和史丹利的寓言中那個絮絮叨叨、不停吐槽你的旁白心跳文學部中一本正經叫出你名字的莫妮卡尼爾機械紀元的最終結局,輔助機會問你:這個遊戲的玩家,你在最後的遊戲中失去了數次生命。你是明白痛苦與苦難的人。你打不打算拯救弱者?
  • 我把遊戲裡的世界看成現實中的生活,我在頹廢中感悟遊戲中的現實
    我以為生活中我是成功的,至少我是這麼認為的。然而,一場遊戲一場夢,人總不會順風順水。變故來得快去得也快,我只知道事後我在床上躺了二年,真的過上夢想中那衣來伸手、飯來張口的「幸福」生活。眼淚不知怎麼的又掉下來,明明說好不去想的,明明已經過去了的。
  • 遊戲中的「蒸汽朋克」風格是什麼?淺談蒸汽朋克在遊戲中的表現
    同時,這種切斷與主流社會關係的狀態自然而然地引出了朋克文化中另一個重要的主題,那就是「DIY精神」。鉚釘鞋、雞冠頭、海報、塗鴉,這些元素如今也被視為朋克的符號。而之後的「朋克」作為一種文化延伸到了文學及藝術領域,自然也影響到了遊戲領域,出現了諸如「賽博朋克」、「蒸汽朋克」、「原子朋克」等等不同風格的朋克作品。
  • 《Foldit》——遊戲中的科學家,現實中的玩家
    不過他其實只是在玩一款遊戲,當然也順便參與到了科研項目中。你可能會好奇玩遊戲也是科研項目?《Foldit》就一款跨界生物科學的遊戲,《Foldit》是一個實驗性的蛋白質摺疊電子遊戲,其中結合了眾包與分布式計算的思想。而研發它的人員也是大有來頭,是由華盛頓大學的計算機科學和工程學系和生物化學學系共同研發並於2008年問世。在遊戲中玩家可以不斷調整蛋白質的三維形狀,以此獲得最高分。
  • 信仰與現實 遊戲世界中的十字架(中)
    經過幾代遊戲的敘述,整個故事漸成體系,表達了遊戲製作者對各種宗教問題的看法。 第一點,《刺客信條》對於人類和神的關係的看法符合我們舉得第一個例子中所存在的觀點:那就是所謂古代人類所崇拜的各類神明其實就是掌握了更高科技的外星種族。
  • 社會學視野中的遊戲與社會
    所謂「遊戲的社會化」指的是:基於快捷的網絡信息傳播能力(如4G、5G技術),過去只有「相聚」在特定時空中才能玩的遊戲,現在可在遠隔重洋的兩人、數人乃至成百上千人之間玩起來這樣一個過程。在這個過程中,人們或通過遊戲平臺內置的系統,或通過社會生活中廣泛使用的通信工具或軟體加以溝通聯繫,甚至在不限於戶內的特定空間中通過肢體動作進行虛擬的「身體接觸」「儀式互動」,使得個人、遊戲與社會之間通過現實與網絡空間的交融,相互滲透、彼此鑲嵌。這個過程之所以能夠被稱為「遊戲的社會化」,原因有三點。其一,參與或捲入「網路遊戲」的人足夠多,組織起來也越來越容易。
  • 遊戲廠商最愛的海怪 盤點遊戲中的利維坦
    不過隨著遊戲玩家口味越來越重,連克蘇魯這種觸手系怪物都可以改編成遊戲大作主角,區區海怪利維坦好像也算不上什麼了。今天,小編就是要說說出現在遊戲中的「利維坦」。看完之後才覺得對戰中蟲族的終極兵種母巢王蟲簡直就是個渣渣。   之後,小編也特地查了一下」利維坦」在《星際爭霸2》中的地位,實際上早在資料片《自由之翼》的任務劇情中就第一次出現了」利維坦」。其作為凱瑞根指揮蟲群的指揮所,類似於《自由之翼》中雷諾的休伯利安號。
  • Oculus 揭秘 VR 中的近場 3D 音效技術(一)
    (volumetric sounds),這是第一篇關於Audio SDK中新功能的文章。在雙聲道3D空間立體聲案例中,脈衝響應IRs很小,但是極其具有方向性。即便超過幾英尺的距離,脈衝響應IRs也不會有很大變化。我們一直在利用這一點,對3D立體聲音頻進行另一種近似模擬,這種技術與距離無關,我們稱之為「遠場」。我們的HRTF資料庫在頭部如同一個有序的球型網格空間內進行捕獲/採樣,而不是堆在一起。