Spellwrath實(shí)時(shí)光線追蹤軟陰影(二)
光線追蹤器追蹤目標(biāo)之后,采取以下步驟來(lái)追蹤陰影:
對(duì)于場(chǎng)景中的每個(gè)像素(2D),我們從它實(shí)際在世界空間中的3D位置處向光源投射射線
如果像素是被遮擋的,存儲(chǔ)遮擋值
如果像素沒(méi)有被遮擋,在緩沖區(qū)的存儲(chǔ)值為1.0
這非常直觀。對(duì)于硬陰影而言,這足以對(duì)所有被遮擋部分著色。簡(jiǎn)單地添加一些光線至每個(gè)像素中,且緩沖區(qū)值小于1.0。
正如之前所說(shuō),我們將一些常見的方法與光柵化技術(shù)結(jié)合來(lái)進(jìn)行實(shí)時(shí)光線追蹤。其中一個(gè)行之有效的方法便是延遲渲染。因此,我們所跟蹤的每個(gè)像素的實(shí)際渲染步驟將在光線追蹤之后完成:
確定像素是否被遮擋(光線追蹤陰影緩沖輸入值小于1.0)。如果被遮擋,使用數(shù)值2。
確定取樣尺寸(光線追蹤陰影緩沖區(qū))
理論上,取樣尺寸可以告訴我們半影在場(chǎng)景中這個(gè)區(qū)域的尺寸。因此,我們需要檢查某個(gè)區(qū)域是否有半影。顯然,我們需要某些角度的因子,除以該像素的深度值便可以得到。
請(qǐng)注意,這里已經(jīng)簡(jiǎn)化了視角轉(zhuǎn)換,即簡(jiǎn)單的除以Z值。這忽略了一個(gè)事實(shí):由于陰影區(qū)域距離觀察者更近,半影在場(chǎng)景空間的尺寸會(huì)更大。當(dāng)保持因子不變而人為增大取樣尺寸來(lái)獲得此效果時(shí),這一點(diǎn)講得通。
為簡(jiǎn)單起見,我們假定觀察者正垂直地看著陰影區(qū)域,即采樣區(qū)域每個(gè)像素的Z值是相同的。
最大的平方距離從而減少至:
接下來(lái)便是簡(jiǎn)單的網(wǎng)格搜索。尋找最近的亮像素進(jìn)行比較,并找到最小平方距離的像素。
網(wǎng)格取樣的頻率及所希望獲得的性能取決于我們自己。取樣越多則半影會(huì)越平滑。
請(qǐng)注意,這個(gè)階段可能會(huì)再次需要像素的Z值來(lái)創(chuàng)建更精確的陰影,且這不取決于觀察者觀看的角度。為此,不用預(yù)先計(jì)算Dmax值,而是在網(wǎng)格搜索時(shí)對(duì)其進(jìn)行計(jì)算,因?yàn)槲覀儾恢繸值能達(dá)到的最遠(yuǎn)點(diǎn)。
此外,還需要把距離內(nèi)的Z值與最近的光亮入口結(jié)合起來(lái)。
這是對(duì)每個(gè)像素進(jìn)行的額外計(jì)算。它不僅加強(qiáng)了準(zhǔn)確性,最重要的是,從獨(dú)立的觀察視角而言,可以忽略此計(jì)算來(lái)加快速度。至少我是這樣做的。
現(xiàn)在,我們知道了某個(gè)限制區(qū)域內(nèi)被遮擋像素到最近亮像素之間的距離。它實(shí)際告訴我們特定點(diǎn)陰影的強(qiáng)度, 其極限位置是:
或者
通過(guò)標(biāo)準(zhǔn)光照方法,使用該值來(lái)給像素著色。
通過(guò)這種方法,在硬陰影之上使用軟陰影僅產(chǎn)生很小的性能損失,因?yàn)槲覀儗?duì)每個(gè)像素進(jìn)行了光線追蹤。速度的損失不受對(duì)象數(shù)量或場(chǎng)景大小的影響,其完全取決于我們希望執(zhí)行的場(chǎng)景大小和樣品密度。
但為什么不模糊陰影邊緣來(lái)創(chuàng)建希望達(dá)到的柔軟效果?因?yàn)檫@樣便不會(huì)獲得極致的效果:
總結(jié)
使用這種方法,可以在實(shí)時(shí)光線追蹤器中最有效最輕松地實(shí)現(xiàn)軟陰影。陰影是完全動(dòng)態(tài)的,不需要預(yù)先計(jì)算。只有額外的幀緩沖區(qū)有進(jìn)一步的內(nèi)存需求時(shí),才需要將陰影數(shù)據(jù)從光線追蹤器中傳輸至后期處理系統(tǒng)中。
如果要慢慢過(guò)渡到光線追蹤實(shí)時(shí)應(yīng)用程序中,必須至少要與現(xiàn)代光柵化技術(shù)的圖形質(zhì)量相匹配。我認(rèn)為這方面的工作我們前進(jìn)的軌道是正確的。