Volume Graphics 目前在計算機遊戲領域的發展和應用情況如何?
Volume Graphics應用在醫學圖像和科學可視化上比較多,而傳統遊戲模型一般是Surfaces Graphics。現在硬體性能提升,加上Volume Graphic也許更真實些,比如渲染動物皮毛。所以想問一下,是否在遊戲領域有所應用,比如最近的暗黑3模型是否有用到?
我感覺大家一直說的Volume Graphics (Volume Rendering)的定義挺模糊。我覺得應該分成幾個種類來討論。1. 類似醫療影像類Volume可視化,2. Participating Media(包括爆炸,煙霧,大氣,毛髮),3. 一些基於Voxel的演算法例如Voxel Cone Tracing(NV的VXGI),流體模擬等。
第一個可視化類的應用感覺在遊戲里比較罕見。
第二類Participating Media相關的應用就非常常見了。但是直接ray marching採樣去求解participting media的方程是很慢的,所以遊戲里很少直接採用ray tracing的。一個可行的行的做法是把particle信息voxelize到一個和光線方向垂直的3d texture上,和shadowmap一樣只不過這裡有許多個2d texture slice,然後從光線方向把particle阻擋光源的信息傳遞給每一個光線後方的slice, 渲染的時候也和shadow map類似的從這個文理中讀取光線的衰減程度。nv的gameworks那套應該就是這樣搞得,可以得到細節比較高的陰影。有興趣了解的可以看看這個文檔http://twvideo01.ubm-us.net/o1/vault/gdc2013/slides/822298Bavoil_Louis_ParticleShadows.pdf。同樣類似的工作也有deep shadow map, https://graphics.stanford.edu/papers/deepshadows/deepshad.pdf, pixar怪獸大學的毛髮就用的這個。
另一類重要的volume相關的渲染就是大氣散射的模擬。記得gta5裡面就把這個做的非常好。用在遊戲的實時渲染中比較成功的工作有https://hal.inria.fr/inria-00288758/file/article.pdf, UE4的天空光就是用的這個演算法。它的做法簡單描述就是將所有計算大氣散射的信息預計算到一個4D文理裡面,文理的坐標分別是海拔高度,相機和垂直方向頂角(zenith angle),視線和太陽光方向的夾角和太陽方向和相機到地心方向的夾角。渲染時候只要求出這些數據然後去讀文理就可以了,我也在自己的引擎里用過這個方法繪製天空,從地面到宇宙都沒問題,就是沒有雲朵。
第三類,一些基於volume的全局光照演算法,有Light Propagation Volume,VXGI等。都是獎光照信息存到一些spatial的數據結構中。UE4里有實現這兩個演算法,只不過因為性能和artifact的關係默認並不會使用它們。
遊戲中早也存在將煙霧,火焰等數據存在3D文理裡面然後把這些數組放置才場景中。這樣做的問題是要分別模擬多個volume,而且你的流體永遠有一個box一樣的邊界。我們組今年提出了一種用D3D最新的Volume Tiled Resource作為容器來模擬的方法,這樣哪怕場景中有許多個流體,也可以用一整個大的紋理覆蓋整個場景。不過目前肯定還沒有遊戲使用個技術就是了,主要也是因為用基於particle的方法沒有上述問題,也能有很好的效果。有興趣的可以看看這個GDC的talk:http://developer.download.nvidia.com/assets/events/GDC15/Dunn_Alex_SparseFluidSimulation.pdf
@龔敏敏 說的SVO是一方面,這個方法目前仍然太昂貴,而且有很多artifact不是很好處理(例如light leaking)。
至於題主說的幾何體表示,本質原因是GPU是一個光柵化渲染器,而用光柵化方法渲染一個Volume是非常低效的。渲染Volume需要做ray marching,在GPU上實現ray marching一般是在體的包圍盒內渲染很多垂直於攝像機的截面,然後在截面運行pixel shader計算每個step。這個過程需要消耗大量的填充率(顯卡需要生成大量的片元,對其運行shader然後寫入幀緩衝),對於遊戲而言這過於昂貴。當然應用也是有的,例如遊戲中如果有穿越雲層的鏡頭,則一般會使用體渲染來繪製雲層(不然也沒啥別的辦法了)。但其他的東西基本都可以用三角形網格正常地畫出來,動物皮毛這種東西用normal map或者最多用個parallax mapping就搞定了。當然你可以認為parallax mapping是基於ray marching的,所以可以理解為某種意義上的體渲染。
比較接近傳統Volume Graphics在遊戲上的應用是雲的渲染。例如我讀過印像比較深的是[1],利用了元胞自動機(cellular automation)在三維數組上進行模擬,然後按逐個球面層渲染去近似化散射公式。
SVO幾乎是唯一的應用了。可惜即便如此UE4也沒有辦法在主流平台上用SVO,空間和性能都還沒到那個程度。UE4的particle field也借鑒了volume的做法,在空間中定義方向場。
動物皮毛不用volume也能渲染得很好。暗黑3用的都是10年前的技術而已。完全不沾邊的。我做的體積渲染https://zhuanlan.zhihu.com/p/24685144暗黑3之類的遊戲沒有體積渲染,用的是雲霧的法線貼圖,flowmap,spherelit和一些模型動畫。對於一般玩家,美術有一百種方法讓你覺得那是體積霧。。。
這東西光是存儲就很大,一個256*256*256的float數據有64M,我模擬100幀煙,不做壓縮就得6個G了。
如果是流體模擬的話,用了加速演算法之後,運算速度也得秒/幀這個級別(我自己GTX480做的大概7-8秒一幀的樣子,如果我把程序性能挖掘到極限,或許1幀1秒吧)。如果是做單散射,一秒也沒多少幀(點光源可能幾十幀吧)。如果是多散射繪製,不做加速(周昆2008年RBF近似)可能也是秒/幀這個級別吧。如果是想做成「實時模擬+多散射繪製+全局光」,最理想的情況下把目前各類技術全合在一起,而且用目前3000塊錢以上的顯卡,想實時估計還是很難。全局光照、體積霧、大氣模擬,是體渲染在遊戲裡面最常見的典型應用,已經是技術標配,在國內普及度不夠,但在國外早已普及。體渲不是個簡單問題,這裡只舉個svo gi的例子,就涉及GPU保守光柵化、體素存儲緩衝加速結構、cone tracing、子表面屬性prefilter、方向性預積分、本地光照模型重建等一系列關鍵問題,若干對效果有重大影響的問題尚未得到徹底解決,甚至還只是工程hack,應用時需要有思想準備。
暗黑3在畫面上屬於效果+美工驅動的遊戲(典型的玻璃渣產品風格),圖形圖像技術並不先進,但美工效果出眾。在場景光照、粒子效果、體積霧方面可能部分應用了體渲染的思路,但注意這些具體技術應用並不是必然的,因為嚴格來講美術驅動的圖形應用可以不拘泥於任何一種具體實現方式,對技術選擇沒有嚴格限制,只要能夠產生近似的視覺效果即可,比方說用半透明面片來模擬體積霧、用序列關鍵幀來做粒子等。體渲染對於強調性能、硬體適配性的大眾遊戲而言,並不是首選技術,它更多的是面向那些追求3A級別畫面質量、不care硬體配置的頂級大作。推薦閱讀:
※如果要提高3D遊戲的幀數,調低哪些特效參數是最有效的?
※有3d眩暈症的人適合在圖形學上深入嗎?
※如何評價CryEngine V?
※如何在畫質上評價最終幻想15?
※實時繪製如何實現丁達爾效應?