Рельефное освещение от точечного источника

30.12.2007 Антон Волков

Несмотря на приближающиеся праздники и чёткую установку Карповича “забыть о работе и отдохнуть”, не смог выкинуть из головы идею сделать быструю отрисовку рельефа не просто при определённом угле падения света, а от точечного источника. Задача осложняется тем, что из точечного источника свет исходит во всех направлениях, а не в одном, как в случае направленного. Не считать же освещение для каждого пикселя в отдельности?! Появилась идея модифицировать карту нормалей, как бы “выпучивая” её в том месте, где находится источник света. Основная засада в том, что попиксельно её рассчитать вроде бы не сложно, но это будет совершенно непотребно по скорости. Пришлось придумать (действуя наполовину методом тыка) способ модификации, который бы делался пакетно стандартными фильтрами и методами наложения Flash.

Применимость этой техники в движке безусловно есть, т.к. мы делаем ставку на однократные расчёты освещения с последующим прижиганием — т.е. свет как бы рисуется на поверхности поверх текстуры. Ну а с выходом Hydra в Flash Player 10 можно будет перенести эти расчёты на шейдеры со всеми вытекающими.

Рельефное освещение от точечного источника
Размер: 1.6Мб

Управление:

  • Мышь — перемещение источника света
  • Клик — изменение цвета освещения
  • Колёсико или +/- — изменить бликовость материала
  • Ctrl + колёсико или +/- — изменить размер светового пятна
  • Пробел — следующая текстура

Надеюсь, что меня наконец-то отпустит и это будет последний пост в этом году :)
С наступающим Новым годом!

Комментарии (21) на “Рельефное освещение от точечного источника”

  1. Michael Yesutin Says:

    Впечатляюще!!! Не смотря на то, что иногда картинка дрожит при перемещении источника света.

  2. Антон Волков Says:

    Это починябельно, я думаю :) Видимо, где-то намудрил с округлением.

  3. Антон Волков Says:

    Так и оказалось. Пофиксил.

  4. Ilya Sergeyev Says:

    Кул!
    С Новым Годом товарищи!
    Желаю вам, шоб в 2008 уже запустили игрулину!

  5. beastriker Says:

    Афигительно!!! просто афгительно!!!!! С Новым Годом!

  6. Say Says:

    Любопытно было-бы взглянуть на код :)
    Кстати, что за программ использовалась для постройки карты нормалей?.. скачал на днях благ для фотошопа - NVIDIA tools (normal map filter).. так себе, немного плоховатенько строит..

    Как на счет исходника bamp mappinga? :)

  7. SmivaL Says:

    осталась проблема из движка 3.0.
    там при сверкании молнии движок вешался конкретно.
    так и здесь - если этот точечный источник света будет достаточно быстро менять радиус освещения (Ctrl + колёсико или +/-) то последствия будут такими же как в случае с движком 3.0.

  8. Антон Волков Says:

    Насчёт исходника, пока не готов ответить, и, в любом случае, его ещё надо доводить — не нравится мне формула бликовости.

    А для расчёта карт нормалей используется всё что угодно из 3D-редакторов (это сейчас все поддерживают, т.к. технология популярно в геймдеве), в том числе и “ручками” (для кресла так и сделали).

  9. Антон Волков Says:

    SmivaL: Боюсь, что тут уже Flash не справляется. Может быть опять из-за MouseEvent, а может из-за частого пересоздания карты блика. Ну для теста, я думаю, потянет.

  10. Прохожий Says:

    Невообразимо. Никогда не думал что это возможно на Flash’е!, без аппаратной поддержки!, и с довольно неплохим fps!. Просто нет слов. 0_o

  11. Анонимно Says:

    Извините за возможно глупый вопрос, но текстура - это обычная двухмерная картинка (в смысле не трехмерная модель, например из papervision или swift3D)??? Если да, то как Вы добились эффекта трехмерности? Могли бы дать ссылку на литературу по технологиям, которые применялись в данной работе?
    P.S.: это гениально!!! я просто поражаюсь возможностям флэша и талантом некоторых людей!!

  12. Антон Волков Says:

    В принципе, всё, что нужно уже рассказано в этом и соседних постах. Поищите информацию по запросу “карта нормалей” или “normals map”. В той же Википедии есть хорошая статья на тему.

  13. Михаил Ткачук Says:

    Меня мучает вопрос. Какова идея реализации бликов. Если по фонгу,то реализована ли возможность нецелого значения показателя бликовости?

    Правильно ли я понимаю что в результате вычислений получается отдельный лайтмап для диффузного света, и отдельный для бликов?

  14. Никита Says:

    Здравствуйте! Эффект шикарный. Поделитесь его созданием (а то что-то в исходники не выкладываете).
    Предполагаю использовалась только карта нормалей. Чтобы создать эффект изменения положения источника света нужно прибавлять значения к одному из цветовых каналов, т.е. передвигая мышку вверх, мы должны прибавлять к красному каналу. Я делаю это только использованием BlendMode, без каких-либо фильтров. Но при таком раскладе прибавляется одинаковое значение цвета ко всей карте, т.е. свет параллелен! Хотелось бы услышать как вы с этим разобрались? Спасибо.

  15. Антон Волков Says:

    Искажали карту нормалей, делали в ней “вмятину”.

    Не понял, как вы добились одним лишь BlendMode смены вектора освещения?
    Меняли карту нормалей?

  16. Никита Says:

    Да. Брал карту нормалей и к ней применял фильтр ColorMatrixFilter (можно ColorTransform - даже проще будет). А сверху накладывал картинку с блендмодом Multiply. Т.е. прибавляя оффсет к каналам я как бы поворачивал карту нормалей вокруг Y или X осей - т.е. получатся создается новая карта нормалей - в ней меняется направление вектора. Но смотрится не так, как Ваш - может из-за карты (взял в интернете первую попавшуюся). Как вы добились эффекта бликовости поверхности и как сделали эту самую “вмятину”? С помощью радиального градиента?

  17. Антон Волков Says:

    Ну так ColorMatrixFilter - это не BlendMode ;)
    ColorTransform - проще? Каким это образом?

    Вмятину - да, шаманством с градиентами и блендами.

  18. Никита Says:

    ColorTransform проще - не надо пересчитывать множество параметров - достаточно менять оффсеты исходя из положения источника света. Хотя по правде, не знаю какой фильтр работает быстрее - ColorMatrixFilter или ColorTransform. А проверять лень. Но опять же - это смотрится не так, как ваша реализация. У вас какой-то секрет - жду не дождусь исходника ).

  19. Антон Волков Says:

    ColorTransform’ом вообще на мой взгляд не сделать.
    Изменение оффсетов не даст изменение вектора освещения.
    Поэтому только ColorMatrixFilter.

    Исходник выкладывать не планируем.

  20. Максим Says:

    Очень здорово. Можно ли купить исходник, если да, то сколько?

  21. Ole Says:

    А где исходники?

Оставить комментарий

(Регистрация)

Powered by WP Hashcash