【GAMES-202实时渲染】4、3D空间全局光照(RSM、LPV、VXGI)
Lec7~8
- 1、Reflective Shadow Maps(RSM)
- 2、Light Propagation Volumes(LPV)
- 3、Voxel Global Illumination(VXGI)
1、Reflective Shadow Maps(RSM)
RSM是一個(gè)特別經(jīng)典的計(jì)算全局光照的方法,前置基礎(chǔ)知識(shí)為:輻射度量學(xué)+光線追蹤原理
全局光照(Global Illumination)= 直接光照 + 間接光照
計(jì)算著色點(diǎn) ppp 間接光照的步驟(2-pass)
-
找出被光源直接照亮的面片 (surface patch)
- 用 shadow mapping,每個(gè)紋素都對(duì)應(yīng)空間中的一塊離散的面片
- 對(duì)于每個(gè)直接照亮的面片qqq,需要知道對(duì)于它來說直接光的出射方向。這個(gè)方向不是相機(jī)的方向,而是目標(biāo)著色點(diǎn) p的方向,并且我們不知道q點(diǎn)的brdf。因此需要做個(gè)假設(shè):被光源直接照亮的反射物是diffuse的
-
把每個(gè)面片當(dāng)做新的光源,計(jì)算每個(gè)間接光源反射到 ppp 點(diǎn)的能量為多少
- 考慮在之前101中提到的對(duì)光源直接采樣
- 積分換元、間接光源的面片所覆蓋的立體角上的積分變?yōu)?strong>直接對(duì)光源面片范圍做積分
- 最難的是渲染方程中的 Visibility 項(xiàng),即在當(dāng)前的微元方向上,p、q點(diǎn)之間是否有障礙物。因?yàn)閜的間接光計(jì)算并不只是算某一個(gè)間接光源,而是很多個(gè)分布在半球各個(gè)地方的間接光源。每個(gè)p點(diǎn)生成一個(gè)shadow map 這不僅不現(xiàn)實(shí),甚至還不夠。。半球上得多少?gòu)坰hadowmap才能覆蓋啊?所以不好算,解決方式為: 不算
下面公式中,就體現(xiàn)了上面描述的過程,要注意的是
- 公式是計(jì)算p點(diǎn)的著色結(jié)果,Li(p,ωi)L_i(p,ω_i)Li?(p,ωi?)才是次級(jí)光源反射過來的光
- 因?yàn)槲覀兗僭O(shè)所有次級(jí)光源的面片都是diffuse的,所以Li=ρπ?ΦdA\displaystyle L_i=\frac{ρ}{π}·\frac{\Phi}{dA}Li?=πρ??dAΦ? ,ρπ\(zhòng)displaystyle\frac{ρ}{π}πρ?為diffuse的BRDF,ΦdA\displaystyle \frac{\Phi}{dA}dAΦ?為次級(jí)光源所接受到的irradiance
- 論文中的公式分母的冪次錯(cuò)誤,4應(yīng)該改為2。(其實(shí)沒錯(cuò),閆老師吃鍵盤)
到此,一個(gè)次級(jí)光源傳遞到著色點(diǎn)的能量就算出來了
如何計(jì)算有哪些次級(jí)光源能影響到目標(biāo)著色點(diǎn)?—— 在光源處的shadow map上,取著色點(diǎn)附近的某一堆紋素所對(duì)應(yīng)的場(chǎng)景的面片作為能夠影響到著色點(diǎn)的次級(jí)光源
- 依然不考慮可見性,即次級(jí)光源是否被某些障礙物擋住
- 不考慮著色點(diǎn)所在面片的朝向
- 不考慮次級(jí)光源與著色點(diǎn)的實(shí)際距離
- 如下圖所示,注意與課程中的符號(hào)不同,圖中著色點(diǎn)為 xxx,其在shadow map上對(duì)應(yīng)的點(diǎn)為p,而p點(diǎn)周圍的紋素對(duì)應(yīng)到場(chǎng)景中的次級(jí)光源面片為 x?2,x?1,x1,x2x_{-2},x_{-1},x_1,x_2x?2?,x?1?,x1?,x2?
- 以x?1x_{-1}x?1?為例,對(duì)應(yīng)在shadow map上的紋素,記錄的應(yīng)該是個(gè)桌子,這桌子上的這個(gè)間接光源是根本不可能照亮x的
2、Light Propagation Volumes(LPV)
直接光照還是照常計(jì)算,LPV方法來解決 實(shí)時(shí)間接光照計(jì)算。細(xì)節(jié)太多,代碼實(shí)現(xiàn)比較難,下面記錄主要思想
關(guān)鍵問題:快速查詢到任何一個(gè)著色點(diǎn)的來自任何方向的間接光radiance(廢話)
關(guān)鍵思想:radiance在空間中傳播的過程中不會(huì)改變
關(guān)鍵方法:使用空間中的一個(gè)個(gè)3D的格子來傳輸從間接光源發(fā)射出來的radiance
把場(chǎng)景切分為一個(gè)個(gè)網(wǎng)格(簡(jiǎn)單的劃分格子,并不涉及層次結(jié)構(gòu))如下圖所示,紅色部分就是間接光源反射出來的radiance。想要知道任何一個(gè)格子接收到的radiance是多少,應(yīng)該怎么算?
算法步驟(4-pass)
-
生成: 找到場(chǎng)景中接收到直接光照的次級(jí)光源Virtual Light Sources(VLS)(同RSM的第一步shadow map,多少光源就做多少?gòu)坰hadow map,最終采樣一部分VLS即可)
-
注入: 把場(chǎng)景預(yù)處理為3D格子(3D紋理),遍歷每個(gè)格子,把這些次級(jí)光源注入最近的格子內(nèi)。這些格子記錄的是VLS向四面八方輻射出的能量分布,因此可以用SH基函數(shù)來壓縮記錄(通常選用4個(gè)來大概的表示)。既然用了SH函數(shù),也就假設(shè)了次級(jí)光源面片為diffuse
-
傳播(Propagation ): 從記錄著VLS的格子上,往周圍6個(gè)格子傳播radiance(按分布情況進(jìn)行分配), 下圖所示依次為向右、左、上、下傳播的情況,接收到能量的格子依然用SH來表示。重復(fù)所有格子的傳播,直至穩(wěn)定(通常迭代4~5次)。迭代結(jié)束后,空間中每個(gè)格子的能量分布情況就已知了
-
著色計(jì)算: 每個(gè)著色點(diǎn)所在格子的 radiance入射分布 已知,解一個(gè)渲染方程即可
算法缺陷
- 如下所示,p點(diǎn)為VLS,它不應(yīng)該照亮墻體的反面,但是在LPV算法下,只要這個(gè)墻比格子的劃分粒度還小,則會(huì)被照亮。很簡(jiǎn)單,因?yàn)樵贚PV算法中認(rèn)為,每個(gè)格子內(nèi)的著色點(diǎn)所接收到的radiance分布一致。也就是背面的點(diǎn)因?yàn)楦鷓在同一個(gè)格子內(nèi),在著色計(jì)算時(shí)就會(huì)用p點(diǎn)的反射出去的radiance來計(jì)算著色,就會(huì)被照亮
- 因此不可以免的會(huì)有下面這種 Light leaking 現(xiàn)象,格子不可能無限的小,計(jì)算量受不了
3、Voxel Global Illumination(VXGI)
與RSM一樣,是2-pass算法
VXGI與前兩個(gè)算法(RSM,LPV)的區(qū)別
- 在RSM中,shadow map上的每個(gè)像素代表的都是場(chǎng)景中的次級(jí)光源表面。在VXGI中,整個(gè)場(chǎng)景完全 體素化,并且是樹狀帶層級(jí)關(guān)系的
- VXGI的第二趟是從相機(jī)出發(fā),打到像素上,然后以錐形向外反射(cone tracing),錐形會(huì)相交到體素化的場(chǎng)景中的VLS(虛擬光源),這些體素對(duì)著色點(diǎn)的貢獻(xiàn)就能算出來。此過程與其他算法的區(qū)別如下
- RSM中做了很多假設(shè),比如次級(jí)光源全部看做diffuse材質(zhì)、不考慮實(shí)際次級(jí)光源到著色點(diǎn)距離等,因此RSM很不準(zhǔn)確
- LPV中的次級(jí)光源完成注入后,僅做 一次傳輸,即可得到 所有著色點(diǎn) 的入射radiance分布,快但不準(zhǔn)
- VXGI需要每個(gè)著色點(diǎn)向外進(jìn)行錐形探測(cè),因此速度會(huì)慢很多,但是著色結(jié)果比較準(zhǔn)確
VXGI算法步驟
- pass 1: Light pass
- 找到哪些體素會(huì)被光源 直接照亮
- 對(duì)于這些體素,存儲(chǔ)入射光分布,以及本紋素內(nèi)所有面片的法線分布。(注意區(qū)別于LPV只存入射分布)
- 已知入射光分布方向,以及法線的分布方向,就能夠算出不同材質(zhì)(glossy diffuse)下的表面的 出射光方向分布。這樣確實(shí)會(huì)比RSM直接假設(shè)次級(jí)表面為diffuse要準(zhǔn)
- 更高層級(jí)的體素,就統(tǒng)計(jì)他下面所有的小體素的入射、法線分布,形成對(duì)于當(dāng)前層級(jí)的體素所包含的所有微表面的入射、法線分布,有點(diǎn)類似MIPMAP的思想
- pass 2: camera pass
- 對(duì)于glossy表面來說,一根光線,反射后變成一個(gè)圓錐
- 暴力一點(diǎn)就直接用椎體與場(chǎng)景所有的體素求交,每個(gè)體素都有入射光、法線分布,因此對(duì)于任意一個(gè)點(diǎn)的反射的radiance就能夠算出來,將所有體素對(duì)于著色點(diǎn)方向的radiance加起來就成。這么暴力就很 慢
- 因?yàn)闃錉顚蛹?jí)關(guān)系的存在,巧了不是,還就是MipMap的思想,根據(jù)圓錐越來越大的覆蓋范圍,直接查詢樹狀結(jié)構(gòu)存放的體素信息,直接查高層的體素,就很快
- 對(duì)于diffuse表面,則反射多個(gè)圓錐即可
效果:非常不錯(cuò),很接近與路徑追蹤的渲染結(jié)果了
- 直接光照部分
- 體素可視化
- 每個(gè)體素存放的經(jīng)過計(jì)算后的反射分布可視化(應(yīng)該是吧。。不太確定哈)
- 間接光照渲染結(jié)果
- 最終全局光照結(jié)果
VXGI大概是2012年發(fā)表的,效果不錯(cuò),但是 開銷太大
- 場(chǎng)景的體素化,計(jì)算量太大,甚至需要預(yù)處理
- 對(duì)于動(dòng)態(tài)物體的實(shí)時(shí)體素化是很難算的
- 這個(gè)算法的步驟,很類似于離線渲染中的Photon Mapping了,所以 確實(shí)慢
總結(jié)
以上是生活随笔為你收集整理的【GAMES-202实时渲染】4、3D空间全局光照(RSM、LPV、VXGI)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于matlab的电力系统输电仿真,基于
- 下一篇: java冒泡排序及面向对象基本概念