
Ручной трехмерный рендер
Пока вся прогрессивная flash-общественность предвкушает появление хардварного 3д, творческая артель «Сумрачные тугодумы», в моем лице, делает ручной трехмерный рендер.
Конечно, все это нужно было сделать еще год назад, тогда было бы гораздо более впечатляюще, но, надеюсь, месяца три до выхода беты molehill у меня есть.
Основные фичи:
— честный z-buffer (можно посмотреть на крабе, который «врезан» в стену слева)
— кд-дерево для статики (можно приделать бсп, но распилы считаю неприемлемыми)
— дизеринг на статике, как в первом unreal (100 лет уже хотел сделать такую штуку)
— скорость (альтернатива7, например, на такой сцене показывает 10-15 фпс даже с простой сортировкой, не говоря уж об DynamicBSP)
В планах:
— сабпиксельная точность для моделек (вершины будут меньше дрожать при перемещении)
— мипмаппинг для моделек
— освещение
— может быть тени
— ну и всякое остальное :)
Нафига все это?
Да хрен знает, просто хочется сделать трехмерную игрушку, а ждать полгода-год до выхода молехила утомительно.

Демка вот тут: megaswf.com/simple_serve/64987/
Если не сложно — отпишитесь по скорости, багам и всему остальному.
Конечно, все это нужно было сделать еще год назад, тогда было бы гораздо более впечатляюще, но, надеюсь, месяца три до выхода беты molehill у меня есть.
Основные фичи:
— честный z-buffer (можно посмотреть на крабе, который «врезан» в стену слева)
— кд-дерево для статики (можно приделать бсп, но распилы считаю неприемлемыми)
— дизеринг на статике, как в первом unreal (100 лет уже хотел сделать такую штуку)
— скорость (альтернатива7, например, на такой сцене показывает 10-15 фпс даже с простой сортировкой, не говоря уж об DynamicBSP)
В планах:
— сабпиксельная точность для моделек (вершины будут меньше дрожать при перемещении)
— мипмаппинг для моделек
— освещение
— может быть тени
— ну и всякое остальное :)
Нафига все это?
Да хрен знает, просто хочется сделать трехмерную игрушку, а ждать полгода-год до выхода молехила утомительно.

Демка вот тут: megaswf.com/simple_serve/64987/
Если не сложно — отпишитесь по скорости, багам и всему остальному.
- +9
- ryzed
Комментарии (43)
Никаких флэш-функций или сторонних движков не используется.
Можно сказать, что я просто рисую пиксели в битмапу.
но для непосвященных выглядит убого, какие-то жуткие модельки с торчащими пикселями, или как они называются в тридэ, воксели?
Будет молехилл, будет круто.
и у тебя же в журнализме тени уже были?
Может и сделаю, если тормозить не будет.
Скорость нормальная.
Из багов — стыки углов стен и домиков выделяются (ошибка рендера, если модели склеены).
Нужно больше текстур чтобы протестировать. Освещение будет какое-то или только статика?
Сейчас так получилось, что текстуры домиков граничат с полом, поэтому и косяки на стыках. Надо будет делать отступ 4-8 пикселей, чтобы не заползали.
Текстур всего 42 штуки.
Освещение будет лайтмапами + гуро на модельках. Одноцветное, скорее всего.
Потом сделай пару демок на OpenGL например. Поймешь как оно все работает. После этого дело за малым, сесть и сделать. Вся необходимая информация или уже будет у тебя в голове, либо ты будешь знать куда копать.
Не так уж много времени ИМХО надо.
Но сделать — это гораздо больше, чем просто знать как :-)
За неделю или две можно управиться.
Основная проблема в скорости, а тут можно и несколько месяцев ковыряться :)
А идея игры под это есть? Или чисто баловство?
Как УФО или что-то подобное.
Кстати внешне чем-то напоминает старую добрую игру Incubation (тоже пошаговая стратегия).
Да, в принципе, на нее и буду ориентироваться.
Мне там не все нравится, но основа очень хороша.
Перестанет хватать — приделаю 3ds или колладу.
вижу haxe в тегах. не могу не испросить подробностей о его использовании в этом деле.
Я расчитывал, что будет как минимум двукратный прирост производительности, но на практике прирост составил 10-15 процентов, по сравнению с обычными векторами.
Использование простое — написано несколько функций (отрисовка треугольников, парсинг ребер и отрисовка для статики, переброска из flash.memory в битмапку). Все это завернуто в swc, которая вызывается из as3.
Изначально функции написаны на as3, а потом один в один переписаны на хаксе. Причина — у меня не работает отладка во флэшдевелопе, поэтому ошибиться можно только один раз, как сапер :)
Когда доведу до ума, перепишу остальное на хаксе, хотя большого ускорения это не принесет.
не совсем правда понял влияние неработающей отладки в FD на переписывание кода в haXe, но это уже мелочи.) из-за быстрой компиляции и поддержки выявления типов?
Если что-то не работает (особенно какой-нибудь редкий «плавающий» баг, например, исчезновение треугольников при редких обстоятельствах), всегда можно воткнуть брейкпоинт и построчно прошагать функцию.
С хаксом и флэшдевелопом я такой возможности лишен, к сожалению. Отладчик просто не всплывает на бряках.
В связи с этим отлов багов сильно замедляется.
Разумеется, можно повтыкать трейсы и тому подобное, но хороший отладчик гораздо лучше.
Поэтому сначала все пишется и отлаживается во флэшбилдере на as3, а уже потом переписывается на haxe.
Погуглю.
livedocs.adobe.com/flex/3/html/debugging_01.html
П.С.: Лирическое: имхо проще писать свой экспортер в максе чем париться над obj/3ds. К томуж когда появится анимация / разные маты и пр., нужно будет это всё куда то девать. Это я не умничаю, а по личному опыту.
До выхода нового плеера скорее чуда не случится, а вот после будет и фпс и ресурсы на все остальные плюшки.
Рендер — часть независимая, и в данный момент самая критическая во флеше.
То что все остальное потребует достаточно ресурсов само собой понятно, и что эти ресурсы в данный момент общие (проц/память). Но суть темы именно о рендере, о его возможностях и перспективах.
Как и говорил Ryzed — будет молехилл, будет круто. С выходом нового плеера практически вся нагрузка рендера пойдет на GPU, проц будет разгружен для всего остального.
Так что суть темы я верно уловил. Человек хочет игрушку, а не треугольники. Просто треугольники это фишка этой игрушки. Но вопрос в другом — может ли летать вся конструкция, а не только пропеллер? Это лично мой вопрос. Так что я не понимаю что ты от меня хочешь FlashRush))) Мне интересно узнать оправдает ли себя этот рендерер в связке с остальными частями.
1. Уровни будут маленькие (32*32 максимум), так что pathfinding можно просчитать заранее.
2. Перемещения проблем не создадут, все пересчитывается и перерисовывается заново каждый кадр.
3. Коллизий не будет, там нечему пересекаться.
4. Анимацию сейчас ковыряю. Будет аналог md2 (покадровая с морфингом). Или вообще, просто покадровая, без расчетов. Тупо куча копий геометрии.
В принципе, там есть еще «внутренние резервы» в отрисовке, на которых можно сэкономить 10-20% процентов времени, но это на черный день, когда совсем уже будет тормозить :)
Не понял вопрос про отрисовку.
Пишем значения в большой Vector., лочим битмап, копируем вектор в битмап (setVector), анлочим битмап. Все, никаких секретов.
Если проседает периодически — значит где-то периодически создаются объекты и включается сборка мусора. Это плохо, никаких new в главном цикле делать не стоит.
Экспортер для анимации сделал свой, да.
Я неделю проболел, так что новый пост будет через несколько дней.
Про отрисовку — вектор это классно я еще не пробовал (пока что тупо copyPixel на CS3 через слоистый рендер). Создаются объекты — нет не создаются. Никакой динамики, кроме предусмотренной (когда реально надо добавить объект в сцену) нет. Но и вобщем даже без добавлений периодически провисает. Я уже начинаю подозревать Array переборщик объектов сцены в этом злодеянии. Вектор знач.шустрее но надо переходить на новый иде. Либо на связанные списки. Вообще я когда начинал писать движок знал намного меньше о флеше (перекладывал с си). Есть смысл написать его заново.
Ну и кстати такой вопрос — сколько у тебя объектов флеша на сцене флеша? Один битмап? Сама сцена это mc или sprite? Какое флеш событие используется под апдейт (и соответственно отрисовку. или на отрисовку другое?) твоего рендерера/движка? Как ты избавлялся от флешевых кадров в секунду? Или не избавлялся? Вот такие вопросы думаю не только меня заинтересуют.
Сделай тестовую демку, выложи где-нибудь и куски кода тоже, в которых сомневаешься.
1. Сцена это Sprite.
2. Один основной битмап. Для UI/мелочи будут использоваться маленькие спрайтики сверху. Или не будет. Как получится.
3. Апдейт и отрисовка в ENTER_FRAME.
4. Не избавлялся. 60 fps поставил, сколько получается — столько получается. Анимация будет завязана на время, а не на кадры.