绘制大量重叠的2D阴影

时间:2014-02-06 09:19:47

标签: c++ geometry shadow

我正在制作一个涉及绘制大量非常简单的重叠阴影的程序。阴影没什么特别之处:它们有硬边,无限远处有一个光源(即所有阴影都是平行的)。独特的方面是阴影代表部分吸收光的区域,许多阴影可以重叠,以逐渐变暗区域。

这是一张图片来说明这个想法:

2D overlapping shadows

我的问题是:在我的程序中捕获阴影(存储为凸四边形)并有效地将它们绘制到屏幕上会有什么好方法?

我可以使用适当的alpha值简单地绘制它们,结果看起来很好,但这样做会非常慢。我认为这是因为许多阴影中的像素被多次绘制。我怀疑只有一次只能吸引每个像素的方法会更快。

我的程序是用C ++编写的,我正在使用Qt进行UI和绘图。我很乐意使用库来进行多边形裁剪或其他事情(例如Clipper或者提升),但我不愿意深入了解OpenGL / GPU的世界(除非有一个特别无痛的这样做的方式)。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分: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 :: geometry可以管理交叉点。