2014-02-06 1 views
2

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

Вот изображение, чтобы проиллюстрировать идею:

2D overlapping shadows

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

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

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

Любые идеи? Благодаря!

ответ

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 (п) сложности с количеством пикселей ^^

Кстати, я думаю, что повышение :: геометрия может управлять перекрестки.

+0

Ах, спасибо! Кажется теперь гораздо проще думать об этом с точки зрения пикселей, а не с точки зрения теневых полигонов. Я попытаюсь реализовать это, и я подозреваю, что производительность значительно возрастет. Если он достаточно быстр, я бы даже попробовал бы суперсэмплинг пикселей для бит сглаживания. – rrwick

+0

@rrwick: Добро пожаловать. Удачи с кодом. Поделитесь результатом, если это возможно. – neuro