我正在制作一个涉及绘制大量非常简单的重叠阴影的程序。阴影没什么特别之处:它们有硬边,无限远处有一个光源(即所有阴影都是平行的)。独特的方面是阴影代表部分吸收光的区域,许多阴影可以重叠,以逐渐变暗区域。
这是一张图片来说明这个想法:
我的问题是:在我的程序中捕获阴影(存储为凸四边形)并有效地将它们绘制到屏幕上会有什么好方法?
我可以使用适当的alpha值简单地绘制它们,结果看起来很好,但这样做会非常慢。我认为这是因为许多阴影中的像素被多次绘制。我怀疑只有一次只能吸引每个像素的方法会更快。
我的程序是用C ++编写的,我正在使用Qt进行UI和绘图。我很乐意使用库来进行多边形裁剪或其他事情(例如Clipper或者提升),但我不愿意深入了解OpenGL / GPU的世界(除非有一个特别无痛的这样做的方式)。
有什么想法吗?谢谢!
答案 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可以管理交叉点。