Рельефное освещение от точечного источника
30.12.2007 Антон ВолковНесмотря на приближающиеся праздники и чёткую установку Карповича “забыть о работе и отдохнуть”, не смог выкинуть из головы идею сделать быструю отрисовку рельефа не просто при определённом угле падения света, а от точечного источника. Задача осложняется тем, что из точечного источника свет исходит во всех направлениях, а не в одном, как в случае направленного. Не считать же освещение для каждого пикселя в отдельности?! Появилась идея модифицировать карту нормалей, как бы “выпучивая” её в том месте, где находится источник света. Основная засада в том, что попиксельно её рассчитать вроде бы не сложно, но это будет совершенно непотребно по скорости. Пришлось придумать (действуя наполовину методом тыка) способ модификации, который бы делался пакетно стандартными фильтрами и методами наложения Flash.
Применимость этой техники в движке безусловно есть, т.к. мы делаем ставку на однократные расчёты освещения с последующим прижиганием — т.е. свет как бы рисуется на поверхности поверх текстуры. Ну а с выходом Hydra в Flash Player 10 можно будет перенести эти расчёты на шейдеры со всеми вытекающими.
Управление:
- Мышь — перемещение источника света
- Клик — изменение цвета освещения
- Колёсико или +/- — изменить бликовость материала
- Ctrl + колёсико или +/- — изменить размер светового пятна
- Пробел — следующая текстура
Надеюсь, что меня наконец-то отпустит и это будет последний пост в этом году :)
С наступающим Новым годом!

31.12.2007 в 00:07
Впечатляюще!!! Не смотря на то, что иногда картинка дрожит при перемещении источника света.
31.12.2007 в 01:13
Это починябельно, я думаю :) Видимо, где-то намудрил с округлением.
31.12.2007 в 05:23
Так и оказалось. Пофиксил.
31.12.2007 в 13:45
Кул!
С Новым Годом товарищи!
Желаю вам, шоб в 2008 уже запустили игрулину!
01.01.2008 в 16:32
Афигительно!!! просто афгительно!!!!! С Новым Годом!
03.01.2008 в 01:12
Любопытно было-бы взглянуть на код :)
Кстати, что за программ использовалась для постройки карты нормалей?.. скачал на днях благ для фотошопа - NVIDIA tools (normal map filter).. так себе, немного плоховатенько строит..
Как на счет исходника bamp mappinga? :)
04.01.2008 в 20:03
осталась проблема из движка 3.0.
там при сверкании молнии движок вешался конкретно.
так и здесь - если этот точечный источник света будет достаточно быстро менять радиус освещения (Ctrl + колёсико или +/-) то последствия будут такими же как в случае с движком 3.0.
04.01.2008 в 20:04
Насчёт исходника, пока не готов ответить, и, в любом случае, его ещё надо доводить — не нравится мне формула бликовости.
А для расчёта карт нормалей используется всё что угодно из 3D-редакторов (это сейчас все поддерживают, т.к. технология популярно в геймдеве), в том числе и “ручками” (для кресла так и сделали).
04.01.2008 в 20:06
SmivaL: Боюсь, что тут уже Flash не справляется. Может быть опять из-за MouseEvent, а может из-за частого пересоздания карты блика. Ну для теста, я думаю, потянет.
05.01.2008 в 12:43
Невообразимо. Никогда не думал что это возможно на Flash’е!, без аппаратной поддержки!, и с довольно неплохим fps!. Просто нет слов. 0_o
29.01.2008 в 15:13
Извините за возможно глупый вопрос, но текстура - это обычная двухмерная картинка (в смысле не трехмерная модель, например из papervision или swift3D)??? Если да, то как Вы добились эффекта трехмерности? Могли бы дать ссылку на литературу по технологиям, которые применялись в данной работе?
P.S.: это гениально!!! я просто поражаюсь возможностям флэша и талантом некоторых людей!!
29.01.2008 в 16:20
В принципе, всё, что нужно уже рассказано в этом и соседних постах. Поищите информацию по запросу “карта нормалей” или “normals map”. В той же Википедии есть хорошая статья на тему.
16.04.2008 в 14:20
Меня мучает вопрос. Какова идея реализации бликов. Если по фонгу,то реализована ли возможность нецелого значения показателя бликовости?
Правильно ли я понимаю что в результате вычислений получается отдельный лайтмап для диффузного света, и отдельный для бликов?
15.09.2008 в 12:02
Здравствуйте! Эффект шикарный. Поделитесь его созданием (а то что-то в исходники не выкладываете).
Предполагаю использовалась только карта нормалей. Чтобы создать эффект изменения положения источника света нужно прибавлять значения к одному из цветовых каналов, т.е. передвигая мышку вверх, мы должны прибавлять к красному каналу. Я делаю это только использованием BlendMode, без каких-либо фильтров. Но при таком раскладе прибавляется одинаковое значение цвета ко всей карте, т.е. свет параллелен! Хотелось бы услышать как вы с этим разобрались? Спасибо.
15.09.2008 в 12:24
Искажали карту нормалей, делали в ней “вмятину”.
Не понял, как вы добились одним лишь BlendMode смены вектора освещения?
Меняли карту нормалей?
15.09.2008 в 13:10
Да. Брал карту нормалей и к ней применял фильтр ColorMatrixFilter (можно ColorTransform - даже проще будет). А сверху накладывал картинку с блендмодом Multiply. Т.е. прибавляя оффсет к каналам я как бы поворачивал карту нормалей вокруг Y или X осей - т.е. получатся создается новая карта нормалей - в ней меняется направление вектора. Но смотрится не так, как Ваш - может из-за карты (взял в интернете первую попавшуюся). Как вы добились эффекта бликовости поверхности и как сделали эту самую “вмятину”? С помощью радиального градиента?
15.09.2008 в 14:07
Ну так ColorMatrixFilter - это не BlendMode ;)
ColorTransform - проще? Каким это образом?
Вмятину - да, шаманством с градиентами и блендами.
15.09.2008 в 15:51
ColorTransform проще - не надо пересчитывать множество параметров - достаточно менять оффсеты исходя из положения источника света. Хотя по правде, не знаю какой фильтр работает быстрее - ColorMatrixFilter или ColorTransform. А проверять лень. Но опять же - это смотрится не так, как ваша реализация. У вас какой-то секрет - жду не дождусь исходника ).
15.09.2008 в 17:44
ColorTransform’ом вообще на мой взгляд не сделать.
Изменение оффсетов не даст изменение вектора освещения.
Поэтому только ColorMatrixFilter.
Исходник выкладывать не планируем.
18.10.2008 в 23:56
Очень здорово. Можно ли купить исходник, если да, то сколько?
24.05.2009 в 00:40
А где исходники?