Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Большая водная поверхность (http://www.flasher.ru/forum/showthread.php?t=174797)

C4Grey 02.02.2012 20:46

Большая водная поверхность
 
Приветствую
В процесе работы над диздоком одной игры встал вопрос - делать ли поддержку фулскрина. Суть вопроса в том, что в основном игровом режиме большую часть экрана будет занимать анимированная водная поверхность, а насколько мне известно, с большими текстурами Flash не очень хорошо дружит. Да, вид в игре изометрический. В стандартном("оконном") режиме вода реализована следующим образом:
1. Есть статическая текстура - довольно-таки реалистично нарсованная водная поверхность.
2. Есть текстура для искажений, используется в DisplacementMapFilter. По размерам она в 2 раза больше статической, состоит из 4 тайлов, в фильтре смещается путем смены параметров матрицы трансформации для метода BitmapData.draw.
3. Так как полученный результат не очень впечетлил, была добавлена еще одна текстура, длиной в два раза больше статической, но равная по высоте. Похожа на статическую текстуру, но на ней более сильно выражено горизонтальная "растяжка" волн. Состоит из 2 тайлов, повторяющихся по горизонтали, соответственно, скроллится по оси Х. Альфа выставлена в 0.5, что в результате наложения двух картинок позволяет получить эффект изменющихся волн, к тому же искаженных DisplacementMapping-ом.
Надеюсь, не очень запутал...
В общем, немного погуглив, понял что с таким расточительным отношениям к размеру текстур я далеко не уйду. Плюс, нашел информацию, что DisplacementMapFilter с большими BitmapData начинает сильно просаживать FPS. Какие пока вижу решения:
1. Генерировать все текстуры с множества тайлов(подходящих друг к другу) - множества, так как хочется создать довольно реалистичную воду(такая общая стилистика игры), без ярко выраженных повторяющихся элементов.
2. Попробовать использовать для DisplacementMapping-а Pixel Bender.

Что можете посоветовать? Алгоритмы, хитрости, стоит ли копать в указанных направлениях, стоит ли вообще в таком случае делать фулскрин?

BuKT 03.02.2012 08:45

Неповторимость тайлинга можно реализовать, например, используя т.н. «Принцип Цикады»

C4Grey 04.02.2012 11:02

Спасибо за совет, алгоритм выглядит интересным, до этого использовал Texture Splatting c добавкой рандома.
Попробовал шейдеры, вроде везде повключал ускорение на GPU, результат не особо радует. Алгоритм таков:
При смене размеров сцены генерируем спрайт с тайлами, размер равен размеру сцены, рисуем его в битмапу - это будет база для применения шейдерного фильтра. По-хорошему надо бы еще отдельно сгенерировать битмапу для тектуры смещения, но я просто добавляю начальный сдвиг к координатам и использую данные с одной текстуры. Таким образом, в шейдер передаем: текстуру воды, время, и размер текстуры(для зацикливания текстуры в шейдере - аналогов TextureWrapping из OpenGL для Flash я не нашел, увы...может чего подскажите, чтобы убрать из шейдера операцию?). В итоге получаем визуально приемлимый результат(с тайлами и цветами еще надо поиграться) для нормального режима. В фулскрине даже при разрешении 1366х768 выжать больше 18.3 FPS не получилось. А ведь в игре планируются частицы(Flintparticles), работа с сервером на Socket...Видимо, остается только делать много анимированных тайлов(бедный дизайнер) + Texture Splatting + использовать «Принцип Цикады».

Да, вот результат:
http://c4.site90.com/flash/water/new/
Графика не моя, используется только для демонстрации, взял с одной похожей по тематике игрушки.
Для фулскрина в консоли нужно ввести комманду "/fs"(без кавычек).


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

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