Metalights : Improved Interleaved Shading 論文解析

在這裏插入圖片描述在這裏插入圖片描述

交錯採樣

本文是在交錯採樣的基礎上進行的一個改進版。我在使用原本的交錯採樣過程中產生了閃爍的效果,閃爍原因很簡單,就是交錯採樣的本質就是想用一個像素去代替周圍的像素去計算光照,這樣就大大減少了需要計算光照的像素,而這樣一來就會出現閃爍的問題。閃爍的本質就是採樣率不夠,因爲周圍的光照計算都落到了一個像素的頭上,那個這個像素在某一幀光照的貢獻發送突變的話,那麼就會發送閃爍。如果我們正常的計算光照,某一個像素光照發生突變的話周圍的像素並不會受到影響,所以看起來就很難看出來抖動。因此我又想採用交錯採樣的大幅優化,又想解決閃爍的問題,所以就發現這篇文章。由於本文是在交錯採樣基礎上進行的改進,因此需要大家已經看過交錯採樣這篇文章纔行。

增強交錯採樣

本文的思路和實現都是非常的簡單。其實本文就是發現了,我們在計算光照的時候,每一塊所對應的光源強度相差可能非常大,比如說有的塊光照非常強,而有的塊又非常弱。而這些塊本質上就是把局部的像素分到不同的塊中,讓他們單獨計算一點光照,然後再收集起來。如果有的塊光照非常強,有的塊光照非常弱,這樣一來,如果這個非常強的一塊所對應的光照強度發生了突變,那麼就會產生非常明顯的閃爍。

因此本文的思路就是將光源按照重要度進行一個排序,然後再將這些光源均勻進行分堆,每一堆的重要度都差不多,如此一來對於某一個像素,與他周圍的像素大家計算的光源都差不多.這樣如果某一個像素的光照強度發送了突變,周圍的像素可以進行一個緩衝,從而減少閃爍的現象。

光源重要度

那本文的核心就是如何確定光源重要度的問題。作者給出的解決辦法就是我們先渲染一個低精度的場景,然後依次遍歷每個光源,然後計算每個光源對這個場景的每個像素的光照貢獻度的綜合作爲重要度。

計算低精度場景

在這裏插入圖片描述
計算低精度的場景的時機要在光照計算之前即可。我們假設我們低精度的場景寬高爲LowWidth,LowHeight。那麼我們應該每間隔 Width/LowWidth,Height/LowHeight這麼大的間接進行一下場景的採樣即可得到一個低精度的場景。

光源重要度計算

在計算完低精度場景之後並且在計算光照之前。我們遍歷每一光源,然後對這個低精度的所有像素計算光照強度,然後把每個像素的光照強度之後作爲光源重要度即可。然後按照光照重要度進行排序,在分類即可。可以用計算着色器進行排序分堆也可以在CPU上進行排序分堆。我推薦是用計算着色器進行排序,如此一來就不用進行GPU與CPU的數據傳輸,可以大大的降低時延。
在這裏插入圖片描述

結果

在這裏插入圖片描述
在這裏插入圖片描述
第一張是用本文優化後的,第二張是未經優化的。從中間紅框區域大家可以看到第一張的網格確實要比第二張更少點,但是這個優化還是不太明顯。
不過這篇文章確實給了我很多啓發,從一開始學習寫代碼,大家都說排序耗時,長此以往我就非常排斥使用排序來解決問題,很多時候根本都想不到還可以用排序來解決問題,這確實是一個不太好的現象。排序是很有效的一個手段,不能因爲耗時就完全不去利用他。

代碼鏈接 : https://github.com/AngelMonica126/GraphicAlgorithm/tree/master/TestCase_004_A

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章