Трехмерная стратежка - 4

Дорогие друзяки, фичекрип не остановить!
Временно забил болт на игровую логику (праздники же, можно и расслабиться) и колбасил новые фичи рендера.
Под катом новости.

тени, occlusion, debug

Демка тут: megaswf.com/serve/94374/ (Space — включить дебаг)

1. Тени
Больше недели потратил на реализацию теней.
Проекционные текстуры и честные шэдоумапы отбросил сразу, даже не стал мудрить с ними, хотя может и зря.

После этого остались 2 варианта. Оба попробовал:
1.1. Честные стенсильные тени.
Об этом можно почитать тут: www.gamedev.ru/code/articles/?id=4201
+ все честно и красиво, попиксельно и с самозатенением
— жрет филлрейт, нужно держать отдельный буфер для стенсила и переводить его в картинку
1.2. Фейковые проекционные тени.
Проекция геометрии на плоскость.
+ относительно быстро
— это фейк

Оба варианта рендерились в отдельную битмапу половинного разрешения (филлрейт в 4 раза меньше), чуть-чуть блурились и накладывались поверх основной картинки с блендингом.

У такого подхода (с отдельной битмапой) следующие недостатки:
— Надо чистить кусок памяти (забивать нулями) перед рендерингом
— Для стенсила надо делать еще один проход, чтобы стенсил перевести в цвет
— Надо перебрасывать из памяти в битмапу, через SetPixels()
— Наличие полноэкранной картинки поверх основной сразу отжирает 4-5 fps
— Неправильно смешивается с лайтмапами (хотя всем пофиг, конечно)
(Самое главное) Никак не избавиться от лишнего затенения частиц! То есть, марин стреляет, а сквозь вспышку от выстрелов видна тень от ствола. Ужасно выглядит.

В итоге, остановился на «ручном рендеринге» проекционных теней с полным разрешением в общую картинку. Что интересно, по сравнению с рендерингом таких же теней в отдельную картинку половинного разрешения, скорость возросла.

Обидно, что нет теней на стенках, но я специально сделал вектор света почти вертикальным (75 градусов), так что этого почти не заметно.

2. Occlusion culling. Мегафича :)
Толковые пацаны (см. www.umbrasoftware.com/ ) на таких штуках рубят нехилое бабло. Их технология лицензирована в третьей версии Unity, между прочим.

Разумеется, у меня все попроще, но принцип тот же.
Сама идея простая: Если объект (или часть) за стенкой (или любым другим «большим» объектом), то рисовать его не нужно, все равно через z-буфер не пролезет.

Рассказываю как сделано у меня:
2.1 Определяем окклюдеры (в препроцессе).
Окклюдером может быть любой выпуклый объект. Можно и невыпуклый, но тогда будет глючить. Окклюдерами есть смысл назначать только большие объекты, чтобы не тратить время на лишние проверки.
2.2 Проецируем все вершины окклюдера на экран.
2.3 Собираем из этих вершин выпуклую оболочку. Почитать можно тут algolist.manual.ru/maths/geom/convhull/
2.4 Для каждого меша определяем список окклюдеров, которые его потенциально заслоняют.
Тут, кстати, не все так просто. Как определить, что объект находится за препятствием, а не перед ним?
Толковые пацаны из большого геймдева строят «бесконечную» пирамиду из лицевых граней препятствия и ребер оболочки, которой и проверяют объекты. Увы, это не так быстро, как хотелось бы. Пришлось делать по другому.
Я вспомнил, как быстро определить, пересекает ли отрезок экран или нет. Алгоритм Коэна-Сазерленда. algolist.manual.ru/graphics/clip_seg.php
occlusion, determination
Предположив, что «окно» это AABB окклюдера, концы отрезка это позиция камеры и объекта соответственно, я получил быстрый метод определения «потенциальных заслонений».
Кстати, есть расширение алгоритма Коэна-Сазерленда для трехмерного пространства, но в моем случае хватает двухмерного.
2.5 Если окклюдер потенциально может заслонить объект — продолжаем. После проекции меша (без рендеринга) у меня есть его AABB на экране. Находим площадь пересечения выпуклой оболочки окклюдера и AABB меша. Варианты:
2.5.1 Площадь пересечения равна 0, значит пересечения не было и объект виден.
2.5.2 Площадь пересечения равна площади AABB, значит объект полностью закрыт и рендерить его не надо.
2.5.3 Площадь пересечения меньше площади AABB, значит скрыта только часть объекта, надо отсекать треугольники.
2.6 Растеризуем окклюдер в «интервальный» буфер. Для каждого экранного Y пишем левую и правые координаты окклюдера. Надеюсь тут понятно.
2.7 Для каждой вершины треугольника определяем, попадает она в интервал или нет. Если все 3 вершины внутри интервалов, значит весь треугольник скрыт и рисовать его не нужно.

Самое плохое, что окклюдинг для моей геометрии нифига не помогает. Тут практически все на экране и скрывать особо нечего.
Так что, наверное, оставлю только пообъектный куллинг для теней. Или может стенки повыше надо сделать.
Не знаю, думаю.

Еще подсветил немного текстуры, стало получше, по моему.
Вроде все.
  • +8

Комментарии (33)

+1
Хватит премудростей — делай игру!!!)) Выглядит всё круто, не стоит тут накручивать до фишек директа 11го) Хочу поиграть уже…
0
Буду делать. Вот еще чуть-чуть поковыряюсь и сразу буду :)
0
Пропадает выделение при вращении камеры. Аналогично, если выделен марин, и при вращении отпустить мышу на клетке, он туда идет.
0
Да, пока пропадает. Камеру еще не трогал.
0
Ты однозначно крут!!!
Очень будет интересно посмотреть что получится в итоге.
0
Надеюсь, не подведу.
+2
а времени до молехила оставалось все меньше и меньше...))))

Соглашусь с ув.тов.darkvam — нужна игра! В топку стенсилово проекционные механизмы — помоему тени тут вообще мало что решают. На таком уровне графики в старых игрушках тени были кружочками под ногами персонажей и всё. И не мешало! Зато представь сколько ты будешь сейчас париться с геймплеем. Какбе продумать структуру для треугольников и рендерер организовать красиво это здорово, но геймплей он же других жертв требует. В стратежке гемор, я бы уточнил — МЕГАГЕМОР с подбором характеристик под карактеров, пушки, итемы и пр.пр.много пр. ЛИБО ты можешь найти такого же оптимиста как ты, только с креном в сторону ИИ! Пока ты будешь АО запекать, он приделает нейросети зеленым ящерицам. Ну и еще биг квесчен — зачем тут 3д? Например такая идея — забить на топ даун камеру и организовать управление от первых лиц. Т.е. игрок будет видеть только то что видят его подопечные, ну разумеется головой можно будет вертеть. Т.е. обана, за углом уже не понятно есть кто или нет. И вообще многие фишки добавляются. Например вместо одного этажа уровень будет из пяти… Вопщем игровой аспект пока прячется за трёхмерным окклюдером — нехорошо есть это!

А так всё круто :D Плюсанул.
0
До беты молехила (только для девелоперов) примерно 3 месяца, до релиза не меньше 6 месяцев, а скорее год. Времени хватит.

Баланс и уровни частично сопру из Incubation :)
Уровни там очень круто сделаны, жаль, что эту игру почти забыли.

3д — потому что «бесплатная» анимация, ну, и вообще, хочется мне сделать 3д.

От первого лица не получится, потому что текстуры вблизи страшны, как моя жизнь.
0
Не-не-не… Такое несовершенное(не совсем то, но не знаю какое слово подобрать) 3D придаёт картинке очень сильный шарм старых игр UFO, X-Com и иже с ними. Единственное чтобы я убрал — это свободную камеру, оставил бы например 4 фикс.положения. ИМХО только сама механика привлечёт к игре ностальгирующих геймеров(меня по любому)...:)
0
До камеры еще руки не дошли, но так, как сейчас, точно не останется.
+2
Не слушай их всех! :D
Делай то что нравится — получай удовольствие от копания с 3d.
Тут никто не может знать во что это все выльется.
PS: для меня твои посты стали пинками в стиле «Иди работай уже, тут люди 3д уже делают, а ты...»
0
Ну тоже верно. Только тут человек игру делает а не 3д движок для массового распространения) Но если нравится — что уж тут сделаешь)
+6
Иди работай уже! Тут люди три-дэ делают, а ты все каменты пишешь!
0
Хорошо, рад что простимулировал :)
0
Я может щас гадость скажу, но жёсткие динамические тени будут плохо смотреться на качественно просчитанных лайтмапах с мягким освещением.

Имхо лучше просто кружочки по челобунами + мягкие качественно посчитанные тени в лайтмапе.
0
Так это и есть просчитанные тени от статики.
Я по другому не умею.
Блурить в фотошопе ну его нафиг.
Еще непонятно, что делать с тенями от дверей/других объектов в случае кружочков.
0
Сейчас у тебя как я понял вообще лайтмапы посчитаны от одного направленного источника света. Попробуй посчитать от точечных расположенных локально. Всё таки это база с крышей и освещение должно по идее быть от светильников на стенах и потолке. Также не плохая идея сделать лампочки разного цвета, например в коридоре аварийный красное освещение сделать.

Можно как я уже говорил отдельно просчитать AO, отдельно лайтмапы, а потом смешать всё в фотошопе, добавив контрастность для АO. Будет выглядеть очень атмосферно.

Ты ведь этот направленный источник не собираешься в релизе оставить, ведь правда? :)

а теней от дверей и не надо делать, просто освещать как и динамические объекты. (я так понял на двери у тебя лайтмапы не кладутся)
0
Ну, вообще, хотел именно так и оставить :)
Ладно, идею понял, буду пробовать.
0
Разноцветное освещение это вообще маст хев! При этом сам цвет можно оставить как бы эмбиентным, плюс добавить светильников разных форм. Допустим потолок это арматурная сетка или просто сетка из блоков и свет снаружи проникает внутрь… допустим снаружи ночь, тогда свет более синий и на полу видна сетка. А в самой комнате допустим один или парочка слабых светильников которые дают небольшой отсвет на стены не трогая сетку на полу.

пример какого-то планирования разноцветного освещения

пара интересных светильников и эффекты от них
0
Выглядит круто, конечно.
Мне бы научиться в максе работать, поднапрячь художественные способности и еще придумать, чтобы всё это освещение не тормозило в игре.
Буду ковырять.
0
Кстати, откуда первый скрин?
0
похоже на ufo aftermath.
0
half-life. Хотел добавить про аутсорсинг графики, но ты я как понял хочешь всё сам.
0
Еще ограничения неясны на контент и «технология» не отработана.
Когда будет готов хоть один уровень — тогда буду думать про аутсорс.
0
Постреляв, немного походив и покрутив — при выстреле по врагу стало вылетать:
RangeError: Error #1125: Индекс 480 выходит за границы диапазона 480.
        atryz.hxEngine.scanRender::HScanRender/AddZBox()
        atryz.engine3d.render::TRender/ProjectAndAddPsZBox()
        atryz.gamelogic.systems.particles::TPSManager/ProjectAndAddZBoxes()
        atryz.gamelogic::TLevel/FirstStep()
        atsoftRender2/onFrame()
  • Z-13
  • Z-13
0
Спасибо, буду смотреть.
0
Пожалуйста.

Удачи! ;)
0
Круто блин :) жаль только, что после выхода Molehill большая часть написанного будет не нужна…
  • _dm_
  • _dm_
0
Molehill не панацея. Это просто возможность юзать более скоростные вычислительные ресурсы. Не думаю что там для всех всё готово… Шейдеры придется писать ручками, алгоритмы оптимизации геометрии — ручками. Кароче ryzed идёт в правильном направлении. В нужный момент он просто слегка перепишет рендерер и получит некст-ген, в то время как мы сядем на альтернативу и будем учить её с нуля)) Хотя альтернатива это движок, со всеми вытекающими профитами. Видел в живую насколько просто там наваять тестовый уровень — впечатляет.
0
Ого где такое посмотреть? только на флеш гамме?)))
0
Нет. На RAFPUG. В живую презентовали как за 15 минут наваять левел. Понятно что должны быть готовы ресурсы типа тексур/геометрии и персонажей со скелеткой и анимацией. Но с другой стороны кодер этим и не занимается. Следующий RAFPUG пройдет в Екатеринбурге насколько я знаю. Вполне может быть что Альтернатива будет и там. А если не они, то ребята которые используют их движок. Так что если реально есть желание заняться 3д — приезжай. Либо пытай ryzed как наваять 3д с нуля)))
0
Софтварный рендер и некст-ген рендер(если это вобще можно так называть т.к ГЛ2.0 ) уже слабо пересекаются. Так что переписывать, скорее всего, прийдется много.
+2
Ничего в этой жизни не пропадает бесследно ;)
Во-первых знания и умения пригодятся.
Во-вторых ни одна технология мгновенно не вытесняет другую (вспомните сколько двд вытесняли сд, когда блюрей пророчил смерть двд и какова еще ситуация). Ну выйдет через год Молехилл, пока обкатается, протестится, застабилится пройдет еще года-два. Пока его начнут применять.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.