|
Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения |
21.02.2015, 15:31
|
#1
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Примитивное освещение
Хочу сделать примитивное освещение, ну типо как на картинке, но думаю это необходимо выполнить на шейдере, так как тяжко перебрать на CPU столько пикселей, но я вообще нуб в GLSL (надо на нём).
Хочу сделать так:
Наведите на путь истинный.
|
(Offline)
|
|
21.02.2015, 16:43
|
#2
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: Примитивное освещение
перевод из одной системы координат в другую делать не матрицей (ей, наверно, такое невозможно), а тупо alpha = atan2(dx, dy) и r = sqrt(dx^2+dy^2), а обратно - dx = r * cos(alpha), dy = r * sin(alpha).
И каждую исходную линию при рисовании её, как тени, рисовать как четырёхугольник, у которого нижняя сторона параллельна верхней и сильно смещена вниз.
Забавный способ.
А ещё можно не плющить пространство, а просто на CPU рассчитать, как стоят чёрные четырёхугольники - тени и тупо их нарисовать до того, как рисуются буквы.
так даже проще.
Т.е., для каждого отрезка (x1, y1) (x2, y2) сначала нарисовать чёрный четырёхугольник (как два треугольника) с вершинами (x1, y1) (x2, y2) (x1*10.0, y1*10.0) (x2*10.0, y2*10.0), а потом как обычно.
P.S. Можно реализовать с помощью матриц - сделать буквы объёмными моделями с некоторой высотой и чёрными сторонами, брать перспективную проекцию видом сверху и инвертировать z-sorting.
P.P.S. Последний способ мне кажется самым удобным
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
Последний раз редактировалось Igor, 21.02.2015 в 18:35.
|
(Offline)
|
|
21.02.2015, 18:01
|
#3
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: Примитивное освещение
По моему в данном случае всё проще и можно расчёты выполнить не выходя за рамки пикселей и 2д.
Берётся много лучей и бросается от источника света во все стороны, так чтобы их плотность была оптимальной для данного разрешения изображения (этот шаг делаем в уме). Теперь берём и производим вдоль каждого луча выборку из текстуры (данного ч/б изображения) шагами с определённой длинной (опять же обусловленной разрешением изображения). Затем мы (этот шаг тоже можно представить в уме) разворачиваем все лучи параллельно друг другу. Теперь перебираем пиксели каждого луча от начала до конца, изображение у нас ч/б, где черный пиксель это препятствие, как только попадется первый черный пиксель -- все остальные можно смело закрашивать чёрным -- это будет тень. Затем представим что все лучи обратно разворачиваются на своё место. Новые полученные цвета записываем обратно по своим координатам и смешиваем с цветным изображением. Понятно что лучи реально разворачивать не надо -- пиксели лежать в памяти линейно в виде массивов, это только чтобы образно лучше представлять что происходит.
|
(Offline)
|
|
22.02.2015, 08:31
|
#4
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Примитивное освещение
extern vec2 pointPos;
vec4 effect( vec4 color, Image img, vec2 tc, vec2 sc ) { vec2 pos = pointPos/love_ScreenSize.xy; vec2 dp = pos-tc; float aphi = dp.y/dp.x; float dx = dp.x/30; float ret = 0;
for (int i = 0; i < 30; ++i) { float x = dx*i; vec4 c = Texel(img,pos-vec2(x,x*aphi)); if(c.a!=0){ ret = 1.0; break; }
} return vec4(0,0,0,1)*ret; }
Юзаю тот шейдер, получаю такую картинку, чем меньше интераций - тем больше квадратность.
Алгоритм:
|
(Offline)
|
|
22.02.2015, 11:41
|
#5
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: Примитивное освещение
Как-то убого выглядит, не?
Моим способом края теней получатся ровными, а не ступеньками, и производительность должна быть повыше. 100 чтений их текстуры для каждого пикселя - очень дофига
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
22.02.2015, 12:00
|
#6
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Примитивное освещение
Я могу сделать полигонами, у меня есть масив полигонов, которым можно вытянуть радиально вершины от источника света, ведь все равно я их рисую в текстуру и прохожу шейдером, так получится прямое рисование искаженных полигонов на экран.
Я не сразу допер что проще можно сделать, а от спрайтов тень есть
|
(Offline)
|
|
22.02.2015, 18:11
|
#7
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: Примитивное освещение
Выглядит примерно так как я предложил. Да будет недостаток точности по краям и избыток ближе к источнику -- нужно разрешение выше ставить, либо делать избирательную точность, но это усложнения алгоритма.
Насчёт того что быстрее геометрия или работа с пикселями. Зависит от характера изображения: если на нем простые геометрические фигуры то будет меньше вершин, а значит и расчётов геометрии меньше. Если изображение очень сложное с большим количеством плавных линий, то лучше раборать сразу в пикселями. В целом подход с геометрией сложнее в расчётах, но даст профит если геометрия простая.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:52.
|