Рисование множества перекрывающихся 2D теней

Я работаю над программой, которая включает рисование множества очень простых перекрывающихся теней. В тенях нет ничего необычного: у них жесткие края, и на бесконечности есть единственный источник света (то есть все тени параллельны). Уникальным аспектом является то, что тени представляют области частично поглощенный свет, и так много теней могут накладываться друг на друга, создавая более темные области.

Вот изображение для иллюстрации идеи:

2D перекрывающиеся тени

У меня вопрос такой: Как можно было бы взять тени в моей программе (хранящиеся в виде выпуклых четырехугольников) и эффективно нарисовать их на экране?

Я могу просто нарисовать их все с соответствующими значениями альфа-канала, и результат выглядит отлично, но это может оказаться очень медленным. Я думаю, это потому, что пиксели, которые находятся во многих тенях, прорисовываются много раз. Я подозреваю, что подход, который рисует каждый пиксель только один раз, мог бы быть намного быстрее.

Моя программа на C ++, и я использую Qt для создания пользовательского интерфейса и рисования. Я был бы счастлив использовать библиотеку для обрезки полигонов или чего-то еще (например, клипер или повышение), но я бы неохотно погрузился в мир OpenGL / GPU (если нет особенно безболезненного способа сделать это).

Есть идеи? Спасибо!

2

Решение

Ну, я думаю, что эффективный способ нарисовать вашу тень — сделать что-то вроде трассировки лучей. По сути, это означает, что вы просматриваете каждый пиксель в своем изображении и рисуете нужный цвет, проверяя, сколько «стенок» проходит обратный луч. что-то вроде :

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 может управлять пересечениями.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]