2014-02-06 154 views
2

我正在研究一個涉及繪製大量非常簡單的重疊陰影的程序。對陰影沒有什麼特別之處:它們有很強的邊緣,並且在無窮遠處有一個光源(即所有陰影都是平行的)。其獨特之處在於,陰影代表部分部分區域的吸收光線,許多陰影可以重疊以形成逐漸變暗的區域。繪製大量重疊的2D陰影

下面是具體說明這個思想的圖像:

2D overlapping shadows

我的問題是這樣的:什麼是採取的影子在我的程序一個很好的方式(存儲爲凸四邊形),有效地借鑑他們到了屏幕?

我可以簡單地用適當的alpha值繪製它們,結果看起來不錯,但這樣做會變得非常慢。我認爲這是因爲許多陰影中的像素被多次繪製。我懷疑一次只能繪製到每個像素的方法可能會快得多。

我的程序是用C++編寫的,我使用Qt來完成UI和繪圖。我很樂意利用一個庫來做多邊形裁剪或者其他東西(例如Clipper或boost),但是我不願意進入OpenGL/GPU的世界(除非有一種特別無痛的方式來做到這一點) )。

任何想法?謝謝!

回答

1

嗯,我認爲有效的方式來繪製你的影子將是做一些像光線追蹤。它基本上意味着你通過圖像中的每個像素,並通過檢查反向光線穿過多少「牆」來繪製正確的顏色。是這樣的:

For every pixel in the image 
    compute the reversed lightray (from the pixel to your light direction) 
    compute the number of walls traversed by your lightray 
    (= nb of intersections with all the segments/walls) 
    draw the pixel according to the number of intersections 
    (the more intersections, the darker) 

它應該很容易和O(N)與像素的^^

順便說數的複雜性,我認爲的boost ::幾何形狀可以管理交叉點。

+0

啊,謝謝!現在看來,以像素爲單位而不是以陰影多邊形來看,這一切似乎都變得更加簡單。我會嘗試實現這一點,我懷疑它的性能會大幅提升。如果速度足夠快,我甚至可以嘗試對像素進行超採樣以獲得一點抗鋸齒。 – rrwick

+0

@rrwick:不客氣。代碼祝你好運。如果可能,分享結果。 – neuro