基于体素的全局光照技术
基于預計算的實時渲染方法,這些方法的核心是使用低階的球諧(或小波)函數來表述某個低頻的方向分布函數,例如環境貼圖和大面積光源,由于這些方向分布函數可以使用少量的球諧函數系數來近似,這使得實時的間接光照計算被大大加速。然而這些方法的限制也非常明顯,他們只能處理場景的靜態部分,并且它們只能處理方向分布函數的低頻部分。
下面我們介紹兩種能夠處理動態場景的實時渲染方法,即本章基于體素的全局光照算法和下一章基于距離場的全局光照算法。
全局光照的計算量非常大,這主要有兩個原因:首先,它需要計算3D場景當中任意兩個點之間的可見性,這種可見性判斷對于基于光柵化的實時渲染流程更加復雜,光柵化擅長于每次處理一個視圖,它通常并不能直接計算出任意兩點之間的可見性,因此這就是為什么光柵化通常只計算直接光照,而更復雜的間接光照(即全局光照)留給其他一些近似方法(比如預計算的方法);其次,表面上每個點的光照計算涉及對表面法線方向上半空間范圍內所有方向的積分計算,這個積分計算已經被證明是非常復雜,以至于目前還不能用于實時計算。
在本書前面介紹的大部分光照技術中,我們都使用三角形等曲面作為基元(primitives)來表述物體的表面,這種表述的細節層次(level of details)被存儲在紋理當中,在進行著色的時候,我們需要首先找到光線與之相交的物體,然后選擇該物體表面對應細節層次的多級紋理進行著色計算。[Crassian et al. 2009]說明,使用體積數據作為幾何基元來表述物體表面,這種數據結構能夠更高效地計算著色需要的細節層次。隨后[Crassian et al. 2011]提出了體積圓錐體追蹤(voxel cone tracing)的概念,在這種方法中,場景中的網格數據被近似為一個階層式的體素八叉樹結構,這個八叉樹結構可以同時用于加速可見性和光照的計算,通過對該體積結構執行類似多級紋理的預過濾,圍繞多個方向的光照積分計算被大大加速。
基于體素的全局光照技術是一種非常優雅的光照技術,自從被提出之后,它已經被大量的游戲引擎采用,例如它最先被集成進了虛幻引擎,此外,該技術也已經被集成進了CryEngine3中。
11.1 圓錐體內的光線追蹤
在開始正式介紹基于體素的全局光照技術之前,我們需要了解一個該技術基于的一個核心概念,即圓錐體追蹤(cone tracing)。
實際上,圓錐體追蹤早至1984年已經被提出,如今它被廣泛用于一些基于體積基元結構的場景表述中,例如本章介紹的基于體素的全局光照技術和下一章介紹的基于距離場的全局光照技術。由于圓錐體追蹤是這兩種全局光照技術的核心,本節就先來了解圓錐體追蹤的該概念。
11.1.1 光線追蹤的問題
圓錐體追蹤是由光線追蹤演變而來的,在光線追蹤中,一條光線從攝像機發出,穿過虛擬屏幕上某個像素的中心進入到場景當中,如圖所示,一旦該光線離開這個像素,它與該像素的任何聯系都因此而消失,因此光線僅僅被定義為由一個起點和一個方向組成的一條直線。這種簡單的定義使得光線與任意物體的相交計算變得非常直觀,然而它也有缺點。
上述關于光線的定義的主要問題在于,每個像素對應相關的所有光線沒有保留足夠的信息去執行反走樣(anti-aliasing),每條光線僅僅允許我們在一個像素的面積范圍內采樣得到一個位置,但是它不知道關于這個采樣點周圍相鄰的任意位置的信息,例如這些位置是否可見,在多大面積內采樣是足夠等。
在標準的光線追蹤中,其唯一能夠實現反走樣的方法是使用更高的分辨率進行采樣,例如[Whitted, 1979a]提出了適應性采樣。但是這種超采樣技術存在一些問題,首先是那些方差較大的像素對應的光線數量會急劇地增長;其次,一些較小的細節可能被這些樣本所忽略。
一種能夠應對上述采樣問題的方法是修改上述關于“光線”的定義為一個“圓錐體”。如圖11.1(b)所示,此時一個“像素”表述的是屏幕上的一個“面積”而不是一個“點”,這種擴展的“光線”(即圓錐)與物體的相交計算不僅能夠決定該光線與某物體的相交測試是否發生,并且還能決定該“光線”的多少部分與該物體相交。這種部分覆蓋信息足夠針對面積執行簡單的反走樣,同時,一個像素內的任意細節都不會被忽略。
總結
以上是生活随笔為你收集整理的基于体素的全局光照技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT5.12安装图文教程与安装成功后环境
- 下一篇: python实现九九乘法表代码解释_py