2014-02-06 103 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