2013-02-16 39 views
13

我最近在OpenGL 4.3中通過在光照方向上追蹤錐體並累積不透明度值,實現了使用體素錐跟蹤的軟陰影。 enter image description hereVoxel Cone Traced Soft Shadows

,我試圖解決或隱藏的關鍵是非常素化的陰影效果遮擋面逐漸接近封堵器,以及隱藏在陰影中,由於表面體素化的斑點清晰。我正在使用低分辨率體素64x64x64;然而,即使我使用更高分辨率的體素,一些較高mip-map級別的低分辨率體素仍然會被追蹤到。

因此,我的第一個想法是:我希望能夠保持最遠距離的陰影中最柔軟的部分,並用陰影貼圖替換更靠近遮擋物的陰影部分。陰影貼圖會逐漸消失,因爲它離每個封閉器更遠,我會以某種方式將它與錐形跟蹤陰影混合。

enter image description here

任何人都可以想辦法消逝基於距離的每個對象的陰影貼圖陰影,然後有它順利融入錐追蹤的影子呢?

我的另一個想法是以某種方式將光線追蹤陰影到更接近遮光板的表面上,但這可能會太昂貴。

另外,我會歡迎任何其他想法來幫助改進我的軟陰影算法。

我也提出了一個視頻顯示它在運動中:

https://www.youtube.com/watch?v=SUiUlRojBpM

還沒有找到一種方法來解決這個問題的陰影。

+1

+1 - 最後再次提出一個問題,這不是一個新手級別,讓我的腦子發癢:)讓我看看我能想到的... – datenwolf 2013-02-16 11:48:57

+1

在錐體跟蹤算法中,你使用體素的alpha值來指示體素是否被佔用?如果是這樣,opengl中的默認mipmapping算法可能不會給你正確的結果。你也使用稀疏體素八叉樹表示? – Slicedpan 2013-02-16 14:24:22

+0

對於間接漫反射和鏡面反射,我通過在所有6個方向上偏移1個體素來對3D紋理進行採樣 - 對於每個mip級別。如果我已經正確理解了這個理論,我想這給了我2x2x2的「磚塊」。我追蹤錐體,直到不透明度值變爲1,並達到我定義的最大距離。我已經注意到,默認的mipmapping不是很流暢,所以我想如果我使用3x3x3磚塊的話,我的結果應該會有所改善 - 性能會更高一點?我沒有使用八叉樹結構,但是這是要實現的東西的列表。 – gboxentertainment 2013-02-17 03:34:37

回答

0

那麼,在這種情況下,你可以通過添加更多的燈。您可以將更多的燈光添加到原來的燈光附近,然後用一堆更近的燈光的陰影組合燈光的陰影。這是'區域光'效應。

2

我在猜測由於體素的大小隻有部分被幾何體填充:「累積不透明度值」,所以出現了「明顯斑點」僞影。從柵格化像素轉換爲體素時,您要採樣多少個樣本?如果樣本容量/體素量較小,則可能存在正確渲染透明度的問題 - 會出現較亮區域顯示的噪聲。

另外,您的體素的透明度方向是否依賴? Based on the author's original paper。方向依賴性對於確保半透明體素的正確渲染非常重要。

A quick picture to explain

「的陰影貼圖,然後把它順利地融入錐追蹤影子?」

這看起來好像是你在腳下拍攝自己。您會獲得更大的性能提升,並且可以獲得陰影貼圖和體素圓錐跟蹤的缺點。體素錐體追蹤很昂貴,但可以提供柔和的陰影並進行全局照明。陰影貼圖在做硬陰影時效果更好,對於較小的場景陰影貼圖效果更好,但是當添加更多幾何圖形時,最終會多次重繪相同的東西,至少每次光照都會重繪一次。

偉大的工作btw。我在爲自己的DirectX實現體素錐跟蹤進行初步研究的同時遇到了您的問題。

[編輯]

我發現我提出在畫面一個錯字。右圖應該是4/64,而不是4/16。我忘了Z維度。

+0

很高興看到其他人也在研究這項技術。我不使用定向依賴透明度。我本來打算用固體體素化代替我的表面體素化,該體素化應消除孔並消除「中空」鏡面反射(即由於體素的半透明混合,我的鏡面反射是透明的)。我擔心使用定向依賴體素是因爲使用固體體素化會花費更多。 – gboxentertainment 2013-03-29 04:15:30