Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   2d filters via GPU (http://www.flasher.ru/forum/showthread.php?t=173268)

BuKT 28.12.2011 08:09

2d filters via GPU
 
Действительно ли можно? Попросили меня сделать пост-эффекты, обеспечивающие блюмы и hdr. Первый уронил фпс в полтора, второй - в два раза. Блюм - это наложенный с альфаканалом bData.clone через BlurFilter, а hdr - тот же блюр, только с предварительным threshold.

В какую сторону вообще копать, чтобы заставить изображение рассчитываться на видеокарте?

Fillini 28.12.2011 11:46

Не уверен, но вроди если сделать фильтры через шейдеры то будет поддержка GPU. Читайте Pixel Bender

-De- 28.12.2011 11:54

Нене, фильтрами нереально. AGAL учите - там шанс есть.

BuKT 28.12.2011 12:14

Агал давно уже выучен, настроен и рисует мне вью, на который и добавляется собственно пост-эффект. То есть я снимаю с него отрендеренную bitmapData, а потом уже блюрю и всячески извращаюсь

-De- 28.12.2011 13:54

Ну так в несколько проходов на агале и делайте. http://www.nulldesign.de/2011/12/07/nd2d-blur/
GPU = только АГАЛ, к сожалению (скажите спасибо тем, кто решил сделать пиксельбендеровские шейдера слабо похожими на те, что видеокарта поддерживает).

BuKT 28.12.2011 17:43

Дело в том, что агал не умеет считывать цвет "соседнего" пикселя во фрагментном шейдере. А значит сразу обламывается с блюром. Да и hdr не сильно то получится сделать.

Посмотрел PB. Ужаснулся. Язык без циклов - это пять

gloomyBrain 28.12.2011 18:02

Ну вот у ребят с ND2D как-то получиось сделать blur. Думаю, что и с HDR это возможно. Другое дело, то blur делается в несколько проходов, а это не самый оптимальный способ. Но он работает

BuKT 29.12.2011 00:38

Если я правильно их понял - у них идут те же операции с битмапДата, только сильно уж высокоуровневые, переданные на "чтение" по uv. Дублированные-передублированные естественно. Тут как минимум нужно учитывать количество мест под текстурные семплеры на видяху.

Есть ещё один вариант(для блюра) - дважды рендерить сцену. (Для настоящего hdr+glow - вообще четырежды - на затемнённые, на высветленные, обычную и четвёртую, блюрящуюся) В оптимизированном варианте второй раз конечно не саму сцену, а Sprite на x+1 перед вьюпортом, на котором лежит текстура с изменяющимися в шейдере uv. Но всё равно конкретно моя сцена будет недовольна необходимостью на каждый кадр грузить в гпу новый семплер.

Ну и как мизерикорд. На опенгл двойной блюр по xy роняет фпс в два раза. Четвертной - в шесть. И это для маленьких спрайтов. А у меня блюр надо класть в идеале на 1080p =)

-De- 29.12.2011 02:56

Цитата:

Сообщение от BuKT (Сообщение 1054136)
Дело в том, что агал не умеет считывать цвет "соседнего" пикселя во фрагментном шейдере.

Сразу скажу - с agal не было нужды работать (но писал и на шейдерном ассемблере под DirectX и на юнитевском языке, который близок к GLSL/HLSL). В агале есть "tex 0x28 texture sample (fragment shader only)", в котором "destination equals load from texture source2 at coordinates source1. In this case, source2 must be in sampler format." Похоже на директ. Что там мешает этот source2 выставить в координаты соседних пикселов и получить что надо?
По-моему народ с ND2D как-то так и сделал. Ну проходов может быть много, да. Но не всю сцену рендерить несколько раз, по текстуре её проходы только. Но на gpu. Но может быть медленнее даже пиксельбендеровского фильтра, надо тестить.

BuKT 29.12.2011 06:42

Цитата:

destination equals load from texture source2 at coordinates source1
Во втором операнде должен находиться предварительно загруженный туда текстурный семплер. Проще говоря - flash.display3D.textures.TextureBase.


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

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