martianov_dev
53 subscribers
17 photos
10 videos
5 links
Привет! Добро пожаловать в мой devlog. Я увлечен изучением технических аспектов разработки компьютерных игр и с радостью делюсь своими открытиями и проектами с вами! @martianov
Download Telegram
+ Кстати
Сегодня оказался на созвоне с разработчиками игр на Defold Engine. Один из них задал мне вопрос: «Расскажи, над чем работаешь, какая у тебя идея?» Я начал рассказывать про технические аспекты проекта – что уже сделано, какие задачи впереди, что планирую добавить позже. Однако самую важную часть – суть самой игры – я специально обошел стороной.

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

Для себя я составил следующий план:

1. Сначала сделаю демо-версию.
2. Потом займусь рендерами.
3. После этого опишу своё видение игры в тексте.
4. И наконец, опубликую всё это.

Пока же я предпочитаю придерживаться стратегии: не говорить о том, что ещё не завершено.
🔥4👍1
За последнюю неделю испытал срыв. Даже не знаю, с чем это связано: может, с перманентным состоянием, что тебя вот-вот уволят за низкую продуктивность, или с тем, что на втором фронте разработка идёт не всегда так гладко, как хочется. Разработка игры — это пот и кровь, вечная работа ради работы. Делаешь одну задачу, на неё приходит целых две.
Например, в игровом движке Defold отсутствует нормальная костная анимация. Нет, она как бы есть, но далека от желаемой функциональности. Поэтому я пишу свой C++ модуль для анимирования, и в целом выходит удачно. Потом шейдеры по-разному ведут себя на Windows и WebGL, решение этих проблем отнимает кучу часов. Плюс ко всему описываю обширный диздок моей игры, хотя бы для того, чтобы дизайнеры, которых я нанимаю, понимали, в каком стиле делать работу.
Итог: кранчу я каждый день с 10 утра до 10-11 вечера. Мне уже даже жена предлагает свою помощь — вы бы видели моё радостное лицо! Но я пока решил сам сделать демонстрационную версию, без этого никуда. Фиг знает, а вдруг я найду инвесторов?
👍5🔥51
Media is too big
VIEW IN TELEGRAM
Что же я успел сделать за последнее время? Пока жду локацию от дизайнера, решил заняться анимацией персонажа. Сделал смешивание анимаций и создал некое подобие состояний. В ToDo добавил задачу по реализации сложных переходов между состояниями, например, из ходьбы в бег, затем в прыжок, падение и так далее. Дел на самом деле еще очень много. Кстати, так как игра планируется мультиплеерной, решил протестировать, как игроки могут взаимодействовать друг с другом "физически", а именно толкаться. Вот, показываю видео :)
👍5🔥51
Media is too big
VIEW IN TELEGRAM
Создал тени от направленного источника, причём они ещё и каскадные! Пока без фильтров, но в будущем обязательно добавлю. В некотором смысле, тени от направленного источника сложнее реализовать, чем от точечного. Приходится разбираться с усечённым конусом, делить зоны детализации и так далее. Но в итоге получилось здорово — мир стал выглядеть более живым 👍
👍7🔥52
Media is too big
VIEW IN TELEGRAM
С приближением праздников меня охватило желание подвести итоги года коротким видео о текущем состоянии игры. И вот что получилось! Дизайнер наконец-то завершил часть уровня, которую я с радостью демонстрирую. Конечно, не обошлось без технических нюансов, но я почти со всеми справился. Уже готово более 30 пропсов, хотя они еще нуждаются в подготовке перед внедрением в игру.
Глядя на проделанную работу, я чувствую, как душа наполняется теплом и гордостью за проект. Каждый элемент, каждая деталь – это частичка моего творчества и усердия.
Особенно хочется поблагодарить комьюнити Defold, кто помогал в этом году 😉

С наступающим!
👍10🔥82
На новогодних каникулах, как ностальгирующий динозавр, я решил вернуться к истокам программирования)) Так сказать после долгих лет купания в теплых водах интерпретируемых языков (этакий детский бассейн), я решил собрать граф движок BGFX под Linux, Windows и, возможно, под web через Emscripten. И тут-то я понял, какая это адская херня сборка библиотек, линковка и прочие радости жизни C++ разработчика.

Ну например, если в других языках уже придумали менеджеры зависимостей на все случаи жизни (чихнул - получи результат), то работая на плюсах, ты ощущаешь какую-то особую, почти интимную связь с компилятором.
Хорошо хоть существует cmake, без него пришлось бы, наверное, приносить жертвы древним богам плюсов чтобы код соизволил скомпилироваться.

Я скучал по этому безумию
🔥53👍3👻2😨1
В продолжение предыдущего поста.

После экспериментов с C++ я перешел на изучение Rust. На мой взгляд, язык довольно многословен, но этим самым он дает лучшее понимание работы кода еще до компиляции. Особенно впечатляет пакетный менеджер Cargo. Вместо простых задачек из школы я обычно сразу перехожу на более сложный уровень, например, инициализацию окна или выбор графического адаптера для отрисовки графики. Почему? Потому что могу)
В целом этот язык подарил мне понимание таких концепций, как мутабельность, владение, перемещение, жизненный цикл переменной и прочие особенности Rust.

Для развлечения я выбрал библиотеку WGPU, которая предоставляет серьезную абстракцию над бэкендами, такими как Vulkan, DirectX 12, Metal, OpenGL, WebGL и, что особенно интересно, WebGPU. Я полностью прошел этот замечательный учебник - https://sotrh.github.io/learn-wgpu/ и собрал на его основе свой первый проект. Кстати, познакомился с языком WGSL. После GLSL он кажется каким-то, ну... не таким :D Но для тренировки ума, развития гибкости мышления - самое то.

Вывод: как бывший Golang-разработчик, переход с Go на Rust кажется мне естественным шагом в развитии, открывающим новые возможности!
13👍7🔥2👻2😨1
Года два назад на новой работе отдал свой код на ревью и получил неожиданную реакцию.

Ревьюер с удивлением спросил, почему у меня такой странный стиль кода. Оказалось, что моя привычка ставить открывающую скобку на той же строке, что и условие, вызвала у него недоумение. Я был озадачен. Для меня это всегда было нормой, и я считал такой стиль грамотным. И только на днях до меня дошло - я невольно оказался участником негласного противостояния в мире программирования.

Пока многие спорят о табуляциях и пробелах, существует еще одно разделение - между стилями K&R и Allman. Я-то всю жизнь писал в стиле K&R, даже не задумываясь об этом. Этот стиль я впитал из книг по C и C++, которые читал в юности.
K&R стиль, названный в честь создателей языка C, экономит место на экране и делает код компактнее. Это было особенно важно раньше, когда разрешение мониторов было низким. А стиль Allman, где скобка ставится на новой строке, больше распространен например в JavaScript.

Забавно, что я только сейчас осознал, насколько глубоко во мне укоренился K&R стиль. Это как открыть в себе неожиданную черту характера. Кто бы мог подумать 🙃
7🔥4👍3
Написал редактор для амбициозного сайд-проекта!

Поставил себе цель - написать редактор кода для одной непростой программы. Но вот незадача: проект написан на чистом C99, без готовых UI-библиотек, и уж тем более без готовых а-ля "компонентов" текстового редактора.

Из абстракций над графикой у меня только "холст" и базовые команды: отрисовка текста / прямоугольников и прочие вспомогательные функции для работы со шрифтом. Но и этого достаточно - остальное дело скилла! Помню, писал что-то подобное для игры на Defold Engine, но там было проще: Lua и готовые решения. А тут голый C!

Первая сложность: работа с массивами байтов вместо удобных строк, как в C++ или Lua. Пришлось либо кодить вручную, либо писать свои абстракции. Начал с простого API для работы со строками на более высоком уровне (скриншот приложил). В процессе прослезился, вспомнив все процедурные языки, на которых кодил в школе... Никакого ООП! Но оказалось, что и без него жить можно - даже классно.

Дальше - дело техники: разбивка текста на строки, расчёт ширины символов, обработка позиции курсора относительно мыши, выделение текста, ввод, конкатенация и сохранение на диск. И всё это — на низком уровне, с минимумом доступных функций.

Зачем такие сложности? Этот проект - максимально легковесный и портируемый начиная с веб, заканчивая Raspberry Pi, FreeBSD, и даже PSP (хотя в последнем случае это просто фан, но возможность все же есть). А редактор кода внезапно стал необходим.

Получилось, на мой взгляд, отлично: никаких утечек памяти, хотя я мысленно молюсь на алгоритмы дефрагментации ОЗУ в той системе, где запустится программа. 😂

Кстати, особенно доволен что сразу внедрил поддержку utf8, правда пришлось в каком то моменте некоторые алгоритмы пересмотреть.

Спасибо!
🔥62👍2👻1😨1
Ну что, давненько я не писал про шейдеры! Пришёл к вам с реймачингом и довольно нестандартной задачей.

Наконец-то зацепил одну из своих давних целей - восстановить 3D-форму, используя только карты высот с шести ракурсов. Писать конвертер в меш скучно, а вот запилить шейдер, который в реальном времени рендерит объект через реймачинг вот это уже веселье!

В чём прикол?
Вместо классического рендеринга полигонов (треугольники и всё такое) я использовал пошаговый алгоритм, который проверяет пересечение лучей с виртуальной сценой. Сцена может быть задана либо математическими функциями (SDF — Signed Distance Functions), либо, как в моём случае, картами высот.

Я взял Blender, поставил Сюзанну в центр и сгенерил 6 карт высот (фронт, бэк, лево, право, верх, низ). Шейдер берёт каждую карту и строит по ней выпуклый объект (как если бы мы "выдавливали" форму из карты высот). Затем все эти формы перемножаются (логическое И), оставляя только их общее пересечение. И вуаля! Мы получаем что-то, что напоминает исходную 3D-модель!

Почему это огонь?
Потому что это альтернативный подход к 3D-реконструкции, который работает полностью в реальном времени и без явного хранения меша. Всё считается на лету в шейдере, и можно легко играться с параметрами, добавлять шум, менять детализацию, и всё это без пересчёта геометрии. + Как бонус очень легко сделать SSAO, и прочие эффекты освещения.

Переводил цвет в 8-bit для того, чтобы я смог сохранить информацию об геометрии и цвете в одной 1024x1024 текстуре. Одна текстура = одна модель. Хотя хоть на диске эта "модель" в моем формате занимает всего 200кб(!), но на видеокарте распакуется во все 3мб.

Конечно, это не идеально точный метод из-за ограничений выбранных проекций, но как эксперимент просто офигенно
🔥7👍2😨21👻1
Пиши шейдер один раз - запускай везде

Начну с того, что если пишешь под десктоп, то шейдеры можно писать на классическом GLSL (версии 120, 130, 330, 430 и т. д.) или на HLSL, если работаете с DirectX. А вот для веба и мобилок обычно используют GLSL ES (упрощённая версия под OpenGL ES) - например, 100 (ES 2.0), 300 (ES 3.0) и т. д. Разница между ними не огромная, но есть нюансы: В новых версиях появляются layout qualifiers, другие типы данных, чуть иной синтаксис. В GLSL ES, например, нельзя просто так взять и объявить переменную без "precision" в фрагментном шейдере и прочие нюансы.

Но иногда хочется писать на современном GLSL 450+, а потом оказывается что на телефоне или в браузере это не запустится. И приходится переписывать кучу кода под каждую платформу.

И тут начинается для большинства абсолютная магия!

В игровых движках типа Unity, Unreal, Godot и даже game maker, всё это уже решено - шейдеры автоматически адаптируются под разные платформы. Например, в Defold недавно завезли поддержку SPIRV-Cross. Говоря отдельно про саму либу, то она умеет превращать шейдеры из SPIR-V (промежуточный бинарный формат) в:
- GLSL (любой версии),
- GLSL ES (для мобилок и веба),
- HLSL (под DirectX),
- MSL (под Metal, для Apple).

SPIR-V это как универсальный байткод для шейдеров. Его можно получить, например, из GLSL с помощью glslang (официальный компилятор от Khronos) или даже из HLSL c помощью DirectXShaderCompiler (не я не проверял)

Я залип на эту тему

Помучился, почитал доки, даже брал консультацию у спецов, чтобы помогли собрать ради спорт интереса glslang + SPIRV-Cross в один бинарник настроив нужные команды лично под меня. Теперь я могу:
1. Написать шейдер на современном GLSL.
2. Скомпилить его в SPIR-V.
3. Конвертнуть в любую целевую версию - хоть под WebGL, хоть под Vulkan или DirectX.

Вот ссылки на проекты благодаря чему это возможно, там же есть собранные отдельные бинарники для быстрых тестов:
SPIRV-Cross https://github.com/KhronosGroup/SPIRV-Cross
glslang https://github.com/KhronosGroup/glslang
5🔥4👍3