Примитивное освещение
Хочу сделать примитивное освещение, ну типо как на картинке, но думаю это необходимо выполнить на шейдере, так как тяжко перебрать на CPU столько пикселей, но я вообще нуб в GLSL (надо на нём).
Хочу сделать так: Наведите на путь истинный. |
Ответ: Примитивное освещение
перевод из одной системы координат в другую делать не матрицей (ей, наверно, такое невозможно), а тупо 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. Последний способ мне кажется самым удобным |
Ответ: Примитивное освещение
По моему в данном случае всё проще и можно расчёты выполнить не выходя за рамки пикселей и 2д.
Берётся много лучей и бросается от источника света во все стороны, так чтобы их плотность была оптимальной для данного разрешения изображения (этот шаг делаем в уме). Теперь берём и производим вдоль каждого луча выборку из текстуры (данного ч/б изображения) шагами с определённой длинной (опять же обусловленной разрешением изображения). Затем мы (этот шаг тоже можно представить в уме) разворачиваем все лучи параллельно друг другу. Теперь перебираем пиксели каждого луча от начала до конца, изображение у нас ч/б, где черный пиксель это препятствие, как только попадется первый черный пиксель -- все остальные можно смело закрашивать чёрным -- это будет тень. Затем представим что все лучи обратно разворачиваются на своё место. Новые полученные цвета записываем обратно по своим координатам и смешиваем с цветным изображением. Понятно что лучи реально разворачивать не надо -- пиксели лежать в памяти линейно в виде массивов, это только чтобы образно лучше представлять что происходит. |
Ответ: Примитивное освещение
PHP код:
Юзаю тот шейдер, получаю такую картинку, чем меньше интераций - тем больше квадратность. Алгоритм: |
Ответ: Примитивное освещение
Как-то убого выглядит, не?
Моим способом края теней получатся ровными, а не ступеньками, и производительность должна быть повыше. 100 чтений их текстуры для каждого пикселя - очень дофига |
Ответ: Примитивное освещение
Я могу сделать полигонами, у меня есть масив полигонов, которым можно вытянуть радиально вершины от источника света, ведь все равно я их рисую в текстуру и прохожу шейдером, так получится прямое рисование искаженных полигонов на экран.
Я не сразу допер что проще можно сделать, а от спрайтов тень есть:rolleyes: |
Ответ: Примитивное освещение
Выглядит примерно так как я предложил. Да будет недостаток точности по краям и избыток ближе к источнику -- нужно разрешение выше ставить, либо делать избирательную точность, но это усложнения алгоритма.
Насчёт того что быстрее геометрия или работа с пикселями. Зависит от характера изображения: если на нем простые геометрические фигуры то будет меньше вершин, а значит и расчётов геометрии меньше. Если изображение очень сложное с большим количеством плавных линий, то лучше раборать сразу в пикселями. В целом подход с геометрией сложнее в расчётах, но даст профит если геометрия простая. |
Часовой пояс GMT +4, время: 18:18. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot