【问题标题】:Drawing lots of overlapping 2D shadows绘制大量重叠的 2D 阴影
【发布时间】:2014-02-06 09:19:47
【问题描述】:

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

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

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

我可以简单地使用适当的 alpha 值将它们全部绘制出来,结果看起来不错,但这样做会变得非常缓慢。我认为这是因为许多阴影中的像素被多次绘制。我怀疑只对每个像素绘制一次的方法可能会快得多。

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

有什么想法吗?谢谢!

【问题讨论】:

    标签: c++ geometry shadow


    【解决方案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 可以管理交叉点。

    【讨论】:

    • 啊,谢谢!现在从像素而不是阴影多边形的角度来考虑它似乎变得简单多了。我会尝试实现这一点,我怀疑性能会大大提高。如果速度足够快,我什至可以尝试对像素进行超级采样以进行抗锯齿处理。
    • @rrwick:不客气。祝你代码好运。如果可能,分享结果。
    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 2010-11-16
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    相关资源
    最近更新 更多