徐訓(xùn)嘉
同濟(jì)大學(xué)軟件學(xué)院,上海 201804
提高場(chǎng)景的光照效果是提升虛擬場(chǎng)景真實(shí)感的有效途徑,人們能夠看到物體是因?yàn)槲矬w的表面反射了從各種光源發(fā)出的光,最常見(jiàn)的有三種光源:方向光,點(diǎn)光源,聚光燈。方向光是由無(wú)窮遠(yuǎn)處射出的平行光線,常用于陽(yáng)光效果的模擬,點(diǎn)光源可以看作由空間中一個(gè)特定位置的點(diǎn)發(fā)出各個(gè)方向的光線,聚光燈則是空間中一個(gè)特定位置的點(diǎn)發(fā)出的特定方向光線的光源,是本文研究的主要范圍。另一方面,除了物體的表面反射,光線穿越空氣等介質(zhì)時(shí)還會(huì)產(chǎn)生散射,光在空氣中的散射會(huì)使光束所穿越空間發(fā)亮,在整體環(huán)境較暗時(shí),這種現(xiàn)象更加明顯,例如陽(yáng)光穿越云層或者樹(shù)林等時(shí)產(chǎn)生的多個(gè)光束的效果,體積光照就是在虛擬空間中模擬上述效果。此類(lèi)效果在虛擬環(huán)境中的應(yīng)用能夠使光照更加具有立體感,有效的提升虛擬場(chǎng)景的真實(shí)感。
本文通過(guò)渲染聚光燈體積光照效果,利用GPU加速,實(shí)現(xiàn)和改進(jìn)了已有的光照算法, 使其更好地在Web3D中運(yùn)行。
為了能有效的在場(chǎng)景多個(gè)光源情況下進(jìn)行渲染,本文采用了基于以下的流程,將渲染場(chǎng)景幾何信息和渲染光照效果分段進(jìn)行。
渲染的每個(gè)階段都通過(guò)vertex shader和pixel shader 利用顯卡的可編程渲染管線進(jìn)行計(jì)算,通過(guò)控制渲染到紋理和渲染到后臺(tái)緩存來(lái)進(jìn)行不同階段間所需資源信息的傳遞。通過(guò)第一個(gè)階段將場(chǎng)景幾何信息保存在紋理中,后續(xù)階段再根據(jù)紋理中的數(shù)據(jù)對(duì)光照進(jìn)行渲染。
渲染的第一個(gè)階段需要使用渲染到紋理技術(shù),從攝像機(jī)的角度,將整個(gè)場(chǎng)景的幾何信息像素化保存在紋理中,給接下來(lái)的渲染提供必要的信息。只有這個(gè)階段會(huì)用到3D場(chǎng)景中物體的信息,因此需要將物體的表面位置信息,表面法向量信息,表面顏色信息保存下來(lái)。
漫反射顏色信息直接通過(guò)3*8bits來(lái)存儲(chǔ)RGB值,法向量信息通過(guò)對(duì)單位法向量進(jìn)行線性處理,將其XYZ分量對(duì)應(yīng)至0至1區(qū)間后用進(jìn)行3*8bits存儲(chǔ),由于直接存儲(chǔ)頂點(diǎn)的XYZ位置信息可能會(huì)產(chǎn)生精度不足的問(wèn)題,這里通過(guò)轉(zhuǎn)換,使用24bits存儲(chǔ)頂點(diǎn)的視空間深度信息,范圍在0至1區(qū)間,在后續(xù)渲染階段,再根據(jù)攝像機(jī)的參數(shù)對(duì)深度信息進(jìn)行還原,得到原有的位置信息。
對(duì)于每個(gè)像素,本文采用的簡(jiǎn)化的光照模型進(jìn)行渲染,只考慮至物體的環(huán)境光與漫反射效果:
為了模擬聚光燈邊緣的光照減弱效果,引入?yún)?shù)fall:
最后根據(jù)公式(1)進(jìn)行疊加,產(chǎn)生物體表面的直接光照效果。
在渲染完表面直接光照的基礎(chǔ)上,通過(guò)設(shè)置多個(gè)采樣面,對(duì)各采樣面的像素進(jìn)行混合疊加來(lái)模擬均勻空間下的單次散射體積光照效果。對(duì)于聚光燈, 由于采用平行平面采樣會(huì)導(dǎo)致在光源點(diǎn)附近光照效果的不平滑,此算法沒(méi)有根據(jù)深度來(lái)設(shè)置平面,而是根據(jù)光照的夾角來(lái)設(shè)置采樣平面。
算法根據(jù)可手動(dòng)設(shè)置的采樣率,將聚光燈的視錐按照相同夾角間隔等分出采樣面,對(duì)于每個(gè)采樣面像素根據(jù)以下公式計(jì)算:
在計(jì)算像素時(shí),需要先判斷采樣點(diǎn)的深度值是否小于第一階段深度紋理所存信息,采樣點(diǎn)深度值大于深度紋理保存值,像素值取零,保證視線被物體遮擋的部分不會(huì)進(jìn)行疊加。
本文所進(jìn)行的試驗(yàn)均在Nvidia GT 240的環(huán)境下進(jìn)行測(cè)試,屏幕分辨率為1024*768:
圖1 算法改進(jìn)結(jié)果
左圖為根據(jù)深度來(lái)設(shè)置采樣面,右圖根據(jù)光照角來(lái)設(shè)置采樣面。兩種方式的采樣率均為16次采樣,渲染幀數(shù)能達(dá)到24幀以上。從圖中可以明顯看出,在相同采樣率的情況下,通過(guò)平行平面采樣在光源點(diǎn)附近會(huì)由于采樣率不足導(dǎo)致光照效果的不平滑,根據(jù)光照角度設(shè)置采樣面就能避免這一現(xiàn)象,在光源點(diǎn)附近產(chǎn)生具有高度真實(shí)感的效果。
本文提出了一種基于極坐標(biāo)采樣的聚光燈體積光照的計(jì)算方法,適用于復(fù)雜和動(dòng)態(tài)的環(huán)境,在光源數(shù)量較多時(shí)也能達(dá)到具有真實(shí)感的實(shí)時(shí)渲染效果。為了能渲染大量光照,出于性能方面的考慮,沒(méi)有引入陰影的機(jī)制,因此在某些情況下會(huì)造成失真的現(xiàn)象。在以后的工作中,使用一些輕量陰影技術(shù)避免此類(lèi)現(xiàn)象的出現(xiàn),并繼續(xù)優(yōu)化算法的瓶頸,將是研究的重點(diǎn)。
[1]Dobashi Y,Nishita T,Yamamoto T.Interactive rendering of atmospheric scattering effects using graphics hardware[J].Proc of the Graphics Hardware.2002.
[2]Baran,Chen,Ragan Kelley,Durand,Lehtinen.A hierarchical volumetric shadow algorithm for single scattering[J].ACM Transactions on Graphics 29,2010.