Я работаю над программой, которая включает рисование множества очень простых перекрывающихся теней. В тенях нет ничего необычного: у них жесткие края, и на бесконечности есть единственный источник света (то есть все тени параллельны). Уникальным аспектом является то, что тени представляют области частично поглощенный свет, и так много теней могут накладываться друг на друга, создавая более темные области.
Вот изображение для иллюстрации идеи:
У меня вопрос такой: Как можно было бы взять тени в моей программе (хранящиеся в виде выпуклых четырехугольников) и эффективно нарисовать их на экране?
Я могу просто нарисовать их все с соответствующими значениями альфа-канала, и результат выглядит отлично, но это может оказаться очень медленным. Я думаю, это потому, что пиксели, которые находятся во многих тенях, прорисовываются много раз. Я подозреваю, что подход, который рисует каждый пиксель только один раз, мог бы быть намного быстрее.
Моя программа на C ++, и я использую Qt для создания пользовательского интерфейса и рисования. Я был бы счастлив использовать библиотеку для обрезки полигонов или чего-то еще (например, клипер или повышение), но я бы неохотно погрузился в мир 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 может управлять пересечениями.
Других решений пока нет …