gpt4 book ai didi

c++ - 绘制大量重叠的二维阴影

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:18 26 4
gpt4 key购买 nike

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

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

2D overlapping shadows

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

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

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

有什么想法吗?谢谢!

最佳答案

好吧,我认为绘制阴影的一种有效方法是进行光线追踪之类的操作。这基本上意味着您遍历图像中的每个像素,并通过检查反向光线穿过多少“墙”来绘制正确的颜色。像这样的东西:

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 可以管理交叉点。

关于c++ - 绘制大量重叠的二维阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21598530/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com