Pixel Bender filter «Normal Mapping» для Flash

Собственно решил изучить Pixel Bender. Быстро попробовав различные математические формулы, решил попробовать сделать что нибудь более крутое. Как раз на одном из моих «родных» форумах, обсуждали написание различных пиксельных шейдеров. Не без помощи одного из «продвинутых» участников форума, я смог написать этот шейдер. Давнишняя моя мечта на самом деле. Пример+исходник под катом.
Свет следует за мышкой:

Исходник
Входные параметры шейдера:
BitmapData — на которую будем применять фильтр.
normal:BitmapData — синенькая карта нормалей.
angle:Number — угол в радианах(для оптимизации алгоритма).

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

Что можно улучшить?
Можно добавить карту освещенности тайла, которая будет хранить в себе освещенность каждого пикселя, и направление на источник света (думаю, ее можно сделать средствами самого Flash).
За помощь в разработке шейдера спасибо Ang3l'у и zebestov'у!
  • +5

Комментарии (11)

0
Только синенькая карта не высот, а нормалей )
А почему говоришь тормозной? Вроде ж шустро отсвечивает.
0
Спасибо, попутал с bumpmapping. На одном Bitmap — да, а на 5-10 начинает тормозить жутко :). По крайней мере у меня.
+2
Изврат у тебя с освещением.
Понятно, что точечный (omni) источник света ты заменил направленным (directional), но зачем его задавать через угол?

float3 lightVector = float3(cos(angle), sin(angle), 1);
cos() и sin() считает для каждого пиксела, хотя они не меняются.
Почему бы этот лайтвектор не сделать параметром?
Один раз посчитал в as3 и используешь.

rgbaColor.rgb *= float3(dot(lightVector, nrmlColor.rgb));
Вот тут, если лайтвектор нормализованный, можно заменить dot на умножение.
Теоретически, выбрасываем две нормализации и деление.
Не факт, но может будет быстрее.

Остальное не смотрел.
0
Совершенно точно будет быстрее. В разы.
0
Хым, раньше для каждого пикселя рассчитывался перевод из углов в радианы, потом я это убрал, а оказывается можно сделать еще проще :).
0
Вот еще пара ссылок, у автора в блоге есть исходники этих шейдеров:
параллакс мэппинг
бамп мэппинг (там текстура «растед стил» так вообще зачетно выглядит)
+3
Для normal-mapping'а плоской текстуры (или же для карт, подготовленных в object-space) не стоит юзать Pixel Bender.
Проще поработать с олдскульным ColorMatrixFilter.
Наши старенькие примеры:
blog.alternativaplatform.com/ru/2007/12/26/normal-mapping/
blog.alternativaplatform.com/ru/2007/12/26/normal-mapping-2/
blog.alternativaplatform.com/ru/2007/12/27/parallax-mapping/
blog.alternativaplatform.com/ru/2007/12/30/spot-normal-mapping/
blog.alternativaplatform.com/ru/2008/01/04/character-parallax/
Исходников под рукой, к сожалению, нет.
0
Тетенька очень крутая получилась.
0
Исходников под рукой, к сожалению, нет.
печально, хотел бы я на них взглянуть, т.к. ColorMatrixFilter я не использовал ни разу.
0
Что-то вроде такого.
wonderfl.net/c/hrob
0
www.showmycode.com + ссылка на swf
метод calculate() в конце
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.