Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Dynamic Blur (http://www.flasher.ru/forum/showthread.php?t=147085)

forhaxed 25.11.2010 18:28

Dynamic Blur
 
Доброго времени суток %username%.

Появилась необходимость создания "Динамического блюра", раскрою:

Есть некий фон (например векторный), и есть например шар, который может двигаться по фону. Сам по себе этот шар прозрачный, но он заблюривает фон. Т.е. получается эффект "грязного стекла", где шар - грязное стекло.

Есть идея грабить в Sprite весь этот фон, его заблюрить, а потом отрисовывать заблюренный фон по маске шара. Но этот способ, как мне кажется, очень ресурсоемкий.
Какие идеи?

chabapok 25.11.2010 18:30

Для таких вещей есть шейдеры.

Навскидку, в данном случае самое правильное решение - шейдер, который используется как фильтр. ИМХО.

forhaxed 25.11.2010 18:33

chaboapok, можно ссылку?

chabapok 25.11.2010 18:50

класс flash.filters.ShaderFilter
шейдеры делаются в программе adobe pixel bender
на сайте адоба есть adobe pixel bender guide и adobe pixel bender reference
в описании flash as programming есть глава 17 работа с шейдерами Pixel bender

и примеры в пиксель бендере есть, простенькие.

gloomyBrain 25.11.2010 21:00

Цитата:

Но этот способ, как мне кажется, очень ресурсоемкий
Вы один раз заблюрили. Все. Больше никаких расчетов - просто показываем что нужно по маске.

Цитата:

Для таких вещей есть шейдеры.
Вот смотрите - берем шейдер и пихаем ему одну картинку. Он нам в ответ выдает другую - уже с некой перерисованной облатстью. То есть мы бегаем по всем пикселям и смотрим, попадают ли они в нужную область и, если да, то что-то делаем.
По сути дела шейдер каждый раз производит какие-то операции + он вынужден бегать по всем пикселям. В случае с маской смазывание происходит один раз и далее - просто показ того, что находится под маской.
ИМХО, худшего решения, чем шейдеры, на AS3 не написать =)

forhaxed 25.11.2010 21:06

gloomyBrain, это все замечательно, но фон не статичный.

gloomyBrain 25.11.2010 21:27

Ну ок, не статичный. Берем BitmapData.draw(), отрисовываем ограничивающий прямоугольник нашего шарика, смазываем его. Можно конечно делать то же самое и шейдером, при небольшом размере неизвестно, что будет быстрее.

ЗЫ
насчет шейдеров - у них есть shaderPrecision (точность), которую если поставить на маленькую, о вроде как быстрее работает

ЗЗЫ
В интернете точно есть примеры реализации блюра через шейдеры. Косяк в том, что чтобы сделать эффект от них похожим на обычный фильтр, придется прогонять картинку через шейдер несколько раз (ибо циклы в PixelBender не поддерживаются для FP)

chabapok 26.11.2010 00:58

Цитата:

ИМХО, худшего решения, чем шейдеры, на AS3 не написать
не спорю - шейдеры имеют свои недостатки.
но если вы приводите ТАКИЕ аргументы -- значит вы шейдерами никогда не пользовались.
пример шейдера блюра идет в комплекте с пиксель бендером.
Циклы действительно не поддерживаются, но прогонять картинку несколько раз не надо%) Конечно, было б удобней с циклами, но вцелом, и без них обойтись можно.

шейдеры компилятся в специальный ассемблер и выполняются видеокартой, а всякие bitmapdata.draw() -- интерпретатором флеша, который славится особой тормознутостью. Эффект "прозрачного шарика" на шейдере будет летать, а на битмапдате будет считаться по кадру в несколько минут %). И это несмотря на то, что и там и там будет "бегать по всем пикселам"

насчет остального - да, возможно. Шейдеры мне показались оптимальными только навскидку, а так как вы пишите тоже можно и будет работать :) Наверно вы правы с том, что шейдер, возможно, для такого - мощновато. Но тут опять же, надо смотреть что за задача.

gloomyBrain 26.11.2010 02:54

Цитата:

если вы приводите ТАКИЕ аргументы -- значит вы шейдерами никогда не пользовались
Пользовался, поэтому и привожу =)

Цитата:

шейдеры компилятся в специальный ассемблер и выполняются видеокартой
Видеокарта, кстати, тоже должна быть специальная. Из списка поддерживаемых.

При этом не забывайте - PB и FP выполняются в разных потоках, по сему польза от PB теряется из-за медленного обмена данными между этими потоками

ЗЫ
Цитата:

а всякие bitmapdata.draw()
А шейдеру Вы что будете отправлять?

chabapok 26.11.2010 20:29

Цитата:

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

Цитата:

При этом не забывайте - PB и FP
что такое РВ FP?

Цитата:

А шейдеру Вы что будете отправлять?
а! Так вот вы о чем
вобщем, вы наверное забыли. Шейдеры можно использовать как фильтры, как функцию наложения, и как просто черный "ящик", который из нескольких картинок делает одну. Так вот, отправлять шейдеру через draw() картину надо (и то не всегда) только в последнем случае. А если работать через фильтры - можно вполне без отрисовок типа draw().

говорю же - с графикой через шейдеры часто работа идет быстрее и более "гладко", чем без них. Если у вас это было не так - то либо у вас что-то сверх специфическое, либо вы что-то не так делали.


Часовой пояс GMT +4, время: 21:59.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.