![]() |
Dynamic Blur
Доброго времени суток %username%.
Появилась необходимость создания "Динамического блюра", раскрою: Есть некий фон (например векторный), и есть например шар, который может двигаться по фону. Сам по себе этот шар прозрачный, но он заблюривает фон. Т.е. получается эффект "грязного стекла", где шар - грязное стекло. Есть идея грабить в Sprite весь этот фон, его заблюрить, а потом отрисовывать заблюренный фон по маске шара. Но этот способ, как мне кажется, очень ресурсоемкий. Какие идеи? |
Для таких вещей есть шейдеры.
Навскидку, в данном случае самое правильное решение - шейдер, который используется как фильтр. ИМХО. |
chaboapok, можно ссылку?
|
класс flash.filters.ShaderFilter
шейдеры делаются в программе adobe pixel bender на сайте адоба есть adobe pixel bender guide и adobe pixel bender reference в описании flash as programming есть глава 17 работа с шейдерами Pixel bender и примеры в пиксель бендере есть, простенькие. |
Цитата:
Цитата:
По сути дела шейдер каждый раз производит какие-то операции + он вынужден бегать по всем пикселям. В случае с маской смазывание происходит один раз и далее - просто показ того, что находится под маской. ИМХО, худшего решения, чем шейдеры, на AS3 не написать =) |
gloomyBrain, это все замечательно, но фон не статичный.
|
Ну ок, не статичный. Берем BitmapData.draw(), отрисовываем ограничивающий прямоугольник нашего шарика, смазываем его. Можно конечно делать то же самое и шейдером, при небольшом размере неизвестно, что будет быстрее.
ЗЫ насчет шейдеров - у них есть shaderPrecision (точность), которую если поставить на маленькую, о вроде как быстрее работает ЗЗЫ В интернете точно есть примеры реализации блюра через шейдеры. Косяк в том, что чтобы сделать эффект от них похожим на обычный фильтр, придется прогонять картинку через шейдер несколько раз (ибо циклы в PixelBender не поддерживаются для FP) |
Цитата:
но если вы приводите ТАКИЕ аргументы -- значит вы шейдерами никогда не пользовались. пример шейдера блюра идет в комплекте с пиксель бендером. Циклы действительно не поддерживаются, но прогонять картинку несколько раз не надо%) Конечно, было б удобней с циклами, но вцелом, и без них обойтись можно. шейдеры компилятся в специальный ассемблер и выполняются видеокартой, а всякие bitmapdata.draw() -- интерпретатором флеша, который славится особой тормознутостью. Эффект "прозрачного шарика" на шейдере будет летать, а на битмапдате будет считаться по кадру в несколько минут %). И это несмотря на то, что и там и там будет "бегать по всем пикселам" насчет остального - да, возможно. Шейдеры мне показались оптимальными только навскидку, а так как вы пишите тоже можно и будет работать :) Наверно вы правы с том, что шейдер, возможно, для такого - мощновато. Но тут опять же, надо смотреть что за задача. |
Цитата:
Цитата:
При этом не забывайте - PB и FP выполняются в разных потоках, по сему польза от PB теряется из-за медленного обмена данными между этими потоками ЗЫ Цитата:
|
Цитата:
Цитата:
Цитата:
вобщем, вы наверное забыли. Шейдеры можно использовать как фильтры, как функцию наложения, и как просто черный "ящик", который из нескольких картинок делает одну. Так вот, отправлять шейдеру через draw() картину надо (и то не всегда) только в последнем случае. А если работать через фильтры - можно вполне без отрисовок типа draw(). говорю же - с графикой через шейдеры часто работа идет быстрее и более "гладко", чем без них. Если у вас это было не так - то либо у вас что-то сверх специфическое, либо вы что-то не так делали. |
Цитата:
|
Цитата:
Цитата:
ЗЫ Цитата:
|
По моему скромному, диалог давно должен быть перерасти в бомбежку исходниками и тестами, а не в выяснение кто что знает))
Сейчас все помешались на этих шейдерах (хотя десятый плеер еще не завоевал весь мир?), любую задачу - сразу "может шейдером?". Не думаю что нужно. Точно такую же задачу как у топикстартера решал буквально месяц назад - динамические подложки полупрозрачные и с блюром. Фон был динамический, но с одним меняющимся объектом, за которым легко "следить". При каждом его изменении слушателям отправлялось событие и они запрашивали обновление - передавали свой ректангл и получали заблюренную область фона. Подлжки были очень большие, поэтому я счел целесообразным блюрить весь фон при его изменении. Если же нужен небольшой фрагмент, то можно блюрить только при запросе - отрисовывать область фона больше ректангла запроса на размер блюра (чтобы не было артефактов - прозрачности на краях), блюрить его и отдавать уже запрошенный ректангл.. как-то так. |
При работе в режиме фильтра засылка изображения в шейдер происходит прозрачно.
Не надо выполнять ресурсоемкую отрисовку draw-ом. Просто задал спрайту filters и готово. Если вы что-то делали, что у вас оно тормозило, то может просто вы не правильно делали? насчет исходников. Тут внезапно создали раздел по pb. Может на днях уже туда... |
| Часовой пояс GMT +4, время: 04:31. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.