Делаю свой движок тут

Я уже говорил, что делаю игру про шашлык на своём собственном движке?

Я никакой не профессиональный программист, не знаю как работать с потоками, понятия не имею что за XOR, и уже примерно лет пять мечтаю сделать свою собственную игру. Не наработать опыта, чтобы вкатиться в какую-нибудь студию, и не наляпать мобильную донатную доилку - я хочу делать игры прежде всего для того, чтобы поиграть в них. Попутно здесь вываливаю немного опыта на будущее для таких же, может кому пригодится

Этот пост в основном играет роль этакого дневника разработки, и рассчитан на подобных мне валенков, которые вообще не знакомы с разработкой

Примерно с февраля 23 года я наконец решил запилить свой игровой движок. Не Unity, не Unreal, не другие доступные движки не стал использовать, просто чтобы выпендриться перед всем миром, знать движок насквозь, и не платить в случае крупного дохода

Начал изучать язык на котором напишу всё это, c++, который почему-то считается сложным. В поисках знаний мне попался сайт, который доходчиво объясняет этот язык

Из всяких IDE я использовал Visual Studio, потому что не знаю аналогов, вмещающих в себя и написание кода, и компилятор, и прочее, и впринципе мало что знаю. А ещё я смог запустить его на 7 винде

Создана для 10, но работает на более не поддерживаемой 7
Создана для 10, но работает на более не поддерживаемой 7

Начал делать что-то

Изучив первые три главы туториала, начал думать как мне выводить на экран 3д картинку

На тот момент я понятия не имел, как работают видеокарты, и что такое OpenGL и DirectX

Поискав и особо нечего не найдя, решил обратиться за помощью к нашумевшему ChatGPT

Если что, Чат выступал в роли учебника, а не индуса. Я не заставлял писать весь код и прочее, вместо этого выпытывал у него знания по необходимой мне теме

Топовый учитель
Топовый учитель

И вот Чат предложил SDL (Simple DirectMedia Layer) - библиотеку, которая специализируется на взаимодействии с твоей пекарней или консолей, принимая ввод с клавомыши и геймпада, и отвечая выводом звука и картинки (есть ещё похожая библиотека GLFW, о ней узнал позже)

Поспрашивав у Чата, как вообще запускать это и что-то там рисовать, а также применив собственные странные алгоритмы отображения 3д на 2д, смог сделать пирамидку, которую можно подвигать

С моим алгоритмом камеру невозможно повернуть. Очевидно, что со своей пирамидкой далеко не уеду, тем более при том что SDL сам по себе совсем не предназначен для 3д графики, и Чат открыл мне OpenGL (Open Graphic Library). Есть ещё DirectX, но он заточен под винду, а это не выгодно для кроссплатформинности, бла бла

Как позже понял, главное и практически единственное предназначение OpenGL'а - отрисовка пикселей, обработанных шейдерами в видеокарте. Для 3д используется не чисто OpenGL, а в основном преобразования в векторах и матрицах, которые затем применяются к вершинам, выкладывая их на плоский экран так, словно там есть какая-то глубина - как мой тот самый алгоритм без поворотов, но гораздо лучше. Это дело упрощает библиотека GLM (Graphic Library Mathematic)

Разобрался, как подключить OpenGL, и заставив его работать в связке с SDL (первый рисует пиксели, а второй выводит их на экран), смог нарисовать треугольник. Затем получив от Чата функции настройки отображения и приёма ввода, заставил камеру крутиться с движением мыши, добавил простое передвижение персонажа и вуаля

Упомяну одну деталь, до определённого момента я совершенно не углублялся в работу с шейдерами, и не знал нечего про матрицы преобразования. Всю эту работу по отрисовке выполняли какие-то специальные функции, зачем-то идущие в комплекте с OpenGL, и видимо использующие заранее подготовленный дефолтный шейдер

Текстурки и модельки

Следующей целью стало заменить эти треугольники на модельки, и наложить на них текстуры вместо этих ярко-бливотных цветов. Чат предложил использовать расширение для SDL - SDL_image, а также новую библиотеку Assimp

Шашлычок

В отличие от других библиотек, в репозиториях Assimp я не нашёл готовых к употреблению библиотечных файлов, а тольку кучу непонятного кода, который необходимо собрать с помощью специальной программы CMake, для того чтобы библиотека подходила для моей системы. Что за CMake, и как его использовать, я узнал на ещё одном интересном сайте Learn OpenGL (оттуда я узнал о GLFW, а также понял как правильно работать с OpenGL, крайне рекомендую сразу начать изучать всё с этого сайта)

Разобравшись как пользоваться CMake, на всякий случай я пересобрал остальные библиотеки, потому что некоторые из них были собраны в дебаг версии вместо релизной. Возникли некоторые сложности с их переподключением к проекту, но эту проблему решило подключение некоторых дополнительных библиотек

Модельки я смоделил сам, два года играюсь блендером и даже помогаю небольшой команде в разработке одной малоизвестной игры

Вот сделал черновую модельку человека для тестов персонажа в моём движке

Это Валера, он устал от жизни и хочет поесть шашлыка. Я ещё думал назвать его Вадимом :3
Это Валера, он устал от жизни и хочет поесть шашлыка. Я ещё думал назвать его Вадимом :3

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

Загрузив текстуры в свой недодвижок, я заметил, что при отдалении пиксели текстур начинают мельтишить, и выглядит это вырвиглазно. Это решается мипмапами - при загрузке текстуры создаются её уменьшенные мыльные копии (мипмапы), которые отображаются вместо основной текстуры при отдалении камеры

мем-отсылка к RTX
мем-отсылка к RTX

Физика

Поиск в интернете не дал адекватных туториалов, и я опять обратился за помощью к Чату. Его предложенный вариант физики столкновений работает на отвали, и пока что служит костылём, но зато он познакомил меня с GLM

Суть того, что предложил Чат, такая: имеется некая точка, обычно где находится активный объект, и радиус шарообразного хитбокса вокруг этой точки. Также имеем три вершины треугольного полигона. С помощью хитрых функций библиотеки GLM, которые я так и не понял, из трёх вершин полигона мы получаем нормальный вектор, перпендекулярный поверхности полигона. Всё теми же непонятными функциями находим расстояние по вектору от точки объекта до полигона. Если получившееся расстояние от точки объекта до поверхности полигона меньше, чем радиус хитбокса, происходит выталкивание по вектору полигона, умноженного на разность радиуса хитбокса и расстояния до полигона

как же я люблю объяснять математику и казаться умным, не понимая в этом особо нечего
как же я люблю объяснять математику и казаться умным, не понимая в этом особо нечего

А работает на отвали, потому что движок пока не определяет границы полигонов, для него они как бы бесконечно широкие. Удалось это кое-как подрезать, но с косяками. Возможно, мне может помочь некоторая информация с википедии

Вдобавок к этому я также реализовал простенькую проверку на прохождение сквозь стены на высоких скоростях. Учитывая скорость объекта, движок определяет примерное место, где был объект в предыдущем кадре, и если между прежним и теперешним положением есть полигон, происходит выталкивание

Шейдеры

Самое вкусное в OpenGL. Чтобы отобразить что-либо, OpenGL пропускает данные этого объекта (положение вершин, направление нормалей, цвет, текстуры и прочее) через цепочку шейдеров, из которых нам обычно доступны для настройки только вершинный (раскладывает вершины на экране) и фрагментный (преобразует эти вершины в пиксели)

Делаю свой движок тут

Понять как работают шейдеры и видеокарты мне внезапно помог пост с дтф

Подробности о шейдерах, их написании и возможностях находятся на сайте Learn OpenGL, который я упоминал выше. Однако у меня возникла смешная заминка, на сайте (да и вообще во всём интернете) объясняется OpenGL версии 3.3. А моё железо, на котором я пишу движок, и которое буквально достал с помойки, имеет процессор Intel Core 2 Duo со встроенной графикой и поддерживает максимум версию 2.1. Пришлось спрашивать Чат о некоторых недоступных мне особенностях шейдеров, и чем их можно заменить

DELL Latitude E4300, старик 2010 года
DELL Latitude E4300, старик 2010 года

Игровые объекты

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

Для объектов я решил заменить загрузку сырых моделей и пнг текстур на собственные форматы файлов, чтобы "упростить" работу с ними (ну и естественно развлечь тех, кто полезет в файлы игры)

Импорт файлов, для которого я даже создал набор функций, использует Assimp (модели), SDL_image (текстуры) и стандартную библиотеку fstream (тексты, а так же для записи новых файлов). В файл модели записываются все вершины, их индексы, нормали, текстурные координаты, а также некоторая информация о костях и анимациях, до которых я пока не дошёл. Текстурный файл содержит все пиксели каждый в виде 3-4 символов, которые отвечают за яркость основных компонентов цвета: красный, зелёный, синий, и иногда прозрачность. Вообще, текстуры неплохо бы сжимать, но я пока не понял как. Тексты тупо переписываются из блокнота

В файлы игры определённо кто-нибудь будет лезть, и чтобы присечь хотябы попытки заменить игровые ассеты, добавил их проверку с помощью хэша - копии файла, которую сжали и получили почти уникальный "пароль" к файлу. Мне было впадлу использовать для этого ещё одну библиотеку, поэтому сделал что-то своё, и оно вроде как работает - замена ассета крашит игру, если не поменять в коде хэш

Редактор

Как в юнити и анриле, я начал делать себе такой же удобный редактор, который позволит импортировать ассеты, редактировать уровни и проверять игру в действии. Пока в разработке, можно только ставить падающих мужиков

Естественно буду крайне благодарен, если найдутся те кто разбираются в работе игровых движков и поможет мне информацией

Общий сбор на дтф
Общий сбор на дтф
1010
7 комментариев

Иногда мне кажется, что это просто большой щитпост

Выхлопные трубы не оттуда сделал :). Они сверху отводят отработавшие газы. Из головки блока цилиндров, а не из поддона картера.

3

Это конечно мощно. Однако не могу не вставить свои 5 копеек (сорри): Делать игры и свой движок вещи не совместимые для одинокого инди разработчика по множеству причин и ограничений, самое страшное из которых - время.

3

в голосяндру с ебыча валеры

Комментарий недоступен