Движок
Megakostyl - это наш экспериментальный проект в области
игростроения. Именно на нём серьёзных игр делать мы вряд ли будет, главная его задача - получение опыта и наработка базы для дальнейших разработок, в особенности (неспроста он так назван) - избавление от разного рода "костылей".
Для вывода графики используется технология обратной трассировки лучей, реализованная программно, видеокарта используется только для вывода конечного результата на экран. В качестве компилятора используется
Free Pascal со средой разработки
Lazarus. Вот список библиотек, которые используются или будут использоваться:
SDL2 - создание и управление окном, обработка различных событий типа клавиатуры и мышки, управление потоками;
OpenGL - графический API;
OpenAL - работа со звуком;
libOGG - формат ogg от
Xiph.Org Foundation, а также их кодеки для мультимедиа:
Vorbis - музыка;
Theora - видео;
FLAC - звук (сжатие без потерь);
FreeType - для работы со шрифтами;
Bullet(?) - физический движок.
В этой теме будет записываться ход разработки данного проекта. Помощь знающих людей, например, весьма приветствуется. А может кто-то наоборот здесь узнает что-то интересное.
Последняя сборка (29.12.2014)
На данный момент реализовано следующее:
Графика
трассировка
- вывод уровня, состоящего из клеток;
- вывод примитивов (сферы, цилиндры);
- вывод спрайтов;
- декали на стенах, полу и потолке;
- мягкие тени (
тут можно увидеть, что это такое);
- многопоточность;
общее
- mipmapping;
- mipmapping для спрайтов и декалей;
- normal mapping;
- detail textures;
- блики по Фонгу;
по движку
- базовая физика (столкновения со стенами и объектами);
- воспроизведение музыки (ogg Vorbis);
- воспроизведение видеороликов (ogg Vorbis+Theora);
Список ToDo
По трассировке:
- адаптивная групповая трассировка первичных лучей;
- оптимизация трассировки теневых лучей;
по графике:
- parallax mapping (normal map + height map);
- небо;
- HDR-освещение, Bloom;
- Depth of field;
- вывод объектов при помощи растеризации (например спрайты для систем частиц);
в целом по движку:
- искусственный идиот;
- пользовательский интерфейс;
- звуковая подсистема (воспроизведение звуков);
- допиливание физики;
- редактор уровней.
История изменений
Собственно, первые попытки реализации трассировщика. Была релизована трассировка 3d-моделей и примитивов типа плоскости и сферы. Помимо мягких теней также присутствовала трассировка вторичных лучей - отражённых и преломлённых. В качестве ускоряющих структур для 3d-моделей использованы
kd-деревья, а для всей сцены в общем -
bvh-дерево. Чуть позже к разработке подключился ещё один мифический персонаж, и мы с ним вместе занимались оптимизацией трассировки и даже размышляли о комбинировании трассировки теневых лучей и растеризации. Но, к сожалению, разработка прекратилась, так как мне надо было отлучиться на год, а мифический персонаж забил на всё.
В виду некоторых обстоятельств реализовано практически ничего не было. Но было решено попытаться реализовать трассировщик, работающий в реальном времени. Для этого следовало сделать различные упрощения в плане задания геометрии уровня. В качестве эталона была принята графика игры
Blood, т.е. уровень задается секторами, состоящими из линий. На скриншотах можно лицезреть первые пробы.
Спойлер 2014 год, январь - апрель - показать Вернувшись в Тюмень, я понемногу начал пилить движок. Реализовал сектора с линиями, точнее, пока только один сектор, но с линиями.
Добавил текстурирование, а позже и normal mapping.
Затем решил расшить наконец-таки систему секторов.
Однако в виду огромного количества костылей, начали проявляться непонятные глюки и косяки с тенями. Помучившись немного, я решил ещё сильнее упростить движок и сделать уровни на клетках.
Вот пара ранних билдов, я уже не помню чем они отличаются:
Swiborg01,
Swiborg02.
Спойлер 2014 год, сентябрь-октябрь - показать Реализовав трассировку
по клеткам, я добавил новый вид примитивов - цилиндр и занялся оптимизациями. Новых фич за это время практически не появилось, зато по оптимизации была проделана значительная работа, в том числе ассемблерные вставки с использованием SSE, упрощение вычислений путём замены на приближённые функции и др. Более подробно о проделанных оптимизациях я опишу как-нибудь отдельно.
Вот сборка от 23.10.2014.
Наконец-то дошёл до спрайтов и декалей. Пришлось написать отдельный модуль для материалов и текстур.
сборка от 26.10.2014
Добавил карты нормалей для декалей, а также блики.
Запилил простенькую физику - столкновения со стенами и примитивами. Глючная немного, но пока что потянет.
сборка от 29.10.2014
Спойлер 2014 год, ноябрь-декабрь - показать Идёт процесс разработки пользователького интерфейса и попутная переработка основы движка. Меню я решил задавать в
xml-формате, в котором хранятся все меню, разметка, фон и т.д. На лицо опять сильное влияние движка
unreal, всё же для какого-то конкретного проекта лучше пилить конкретное меню со своими ништяками, так как при универсальном подходе сложность реализации каких-либо эффектов многократно возрастает.
Прикрутил воспроизведение музыки и видеороликов в формате
Ogg Vorbis и
Theora, переработав старые исходники. Музыка проигрывается потоково (stream) в отдельном потоке (thread). Весьма кстати пришлась новая функция
SDL2 SDL_UpdateYUVTexture, которая упрощает вывод декодированного кадра.
сборка от 16.12.2014
Наконец-то слепил вместе меню и сам процесс игры, пока правда не обошлось без пары костылей, но уже весьма ощутимое продвижение.
сборка от 29.12.2014
Этот год был годом эксперимента с сервером Фреи. И хотя эксперимент оказался не совсем удачным, мы много чего изучили нового и получили немало опыта, который обязательно пригодится в будущих проектах. Пиление Мегакостыля совсем заглохло...
Но в декабре, обсудив на совещании итоги уходящего года и определившись с дальнейшим вектором развития ViaTeam, мы решили поставить ещё один экперимент, переквалифицировав проект MegaKostyl Engine...
2016-й год был весьма трудным. Времени и бодрости духа часто не хватало на масштабную задумку, кою мы решили замутить. Однако процесс медленно, но всё-таки шёл. Приходилось много размышлять об архитектуре движка. Мне постоянно хотелось сделать его максимально универсальным и добавить побольше разных фич, что, видимо, являлось следствием влияния
Unreal Engine. Но как-то я вспомнил про одну умную книжку и решил перечитать/дочитать её. Множество вещей, описанных в ней, было просто откровением. И я осознал, что целый год маялся хернёй, вместо того, чтобы пилить действительно то, что нужно. После этого работа над движком пошла веселей.
Но всё же наработки в течении года, в принципе, нельзя назвать пустой тратой времени. Я опробовал кое-какие идеи, отладил некоторые механизмы, в том числе генерацию мипмап бикубическим фильтром.
Собственно, в итоге я решил кардинально изменить структуру движка и начал пилить утилиту для работы с моделями, попутно разбираясь с премудростями работы с вершиными буферами и шейдерами OpenGL.