Вот и подоспел новый релиз. К сожалению успел далеко не все, что запланировал по фичам, однако новый релиз содержит множество исправлений
https://github.com/thunder-engine/thunder/releases/tag/2024.3
https://github.com/thunder-engine/thunder/releases/tag/2024.3
GitHub
Release Release 2024.3 · thunder-engine/thunder
Features
Render: Geometry shaders #722 (#723)
Render: Instancing manager #194 (#759)
Render: SSBO as instancing data source on desktop platforms #758 (#757)
Refactoring
Core: Byte array type cha...
Render: Geometry shaders #722 (#723)
Render: Instancing manager #194 (#759)
Render: SSBO as instancing data source on desktop platforms #758 (#757)
Refactoring
Core: Byte array type cha...
🔥3
Подготовил просто огромный PR посвященный рефакторингу системы анимации. а так-же пофиксил некоторые баги относящиеся к таймлайну. К сожалению таймлайн все еще очень далек от идеала. Но стал чуточку стабильней.
🔥3
После того как замержил рефакторинг системы анимации. Стало возможно замержить первую версию плагина, добавляющего импорт из Spine 2D! Базовый функционал Spine 2D теперь доступен всем =)
🔥2
Прошло практически 2 месяца с моего последнего сообщения. Много чего случилось за это время, хорошего и не очень. Сперва о хорошем. Мы провели первый фестиваль разработчиков игр в Нижнем Новгороде. Я выступал с лекцией "Виды шейдеров или как перестать бояться и полюбить свою GPU"
https://www.youtube.com/watch?v=Wg9jL-QtmFs&list=PLMrw8vPDDhsNIvbovnbOkaLi6hiWws4xZ&index=12&pp=iAQB
Полный набор лекций можно глянуть тут
https://www.youtube.com/playlist?list=PLMrw8vPDDhsNIvbovnbOkaLi6hiWws4xZ
https://www.youtube.com/watch?v=Wg9jL-QtmFs&list=PLMrw8vPDDhsNIvbovnbOkaLi6hiWws4xZ&index=12&pp=iAQB
Полный набор лекций можно глянуть тут
https://www.youtube.com/playlist?list=PLMrw8vPDDhsNIvbovnbOkaLi6hiWws4xZ
YouTube
GEEKON FEST 2 | 12 Виды шейдеров или как перестать бояться и полюбить свою GPU | Евгений Приказчиков
Виды шейдеров или как перестать бояться и полюбить свою GPU
Евгений Приказчиков, разработчик компьютерной графики, создатель игрового движка Thunder Engine
--
Канал "Практика гейм-дизайна" https://t.iss.one/justGameDesign
Фестиваль GEEKON FEST 2 https://www.geekon.ru/…
Евгений Приказчиков, разработчик компьютерной графики, создатель игрового движка Thunder Engine
--
Канал "Практика гейм-дизайна" https://t.iss.one/justGameDesign
Фестиваль GEEKON FEST 2 https://www.geekon.ru/…
❤3👍1
Познакомился лично и прогулялся по Нижнему в компании Виталия Казунова и Михаила Шкредова. Обсудили игровую индустрию и полюбовались нашим городом. Фоток с прогулки не будет, т.к. я совершенно забыл об этом =(
👍3
Теперь немного о грустном. Начиная с Апреля месяца мы занимались разработкой игры Toad-O-Mental на Юнити. Разработка началась на джеме Ludum Dare #55. B мы решили ее продолжить. Изначально мы планировали использовать Thunder Engine для разработки. Это было бы первое участие движка в мероприятии такого вида. Но перед стартом джема, обнаружилось большое количество проблем в редакторе и я понял, что не смогу одновременно исправлять проблемы с редактором и писать игру на нем в (джем шел 3 дня). По окончании джема, мы решили попробовать продолжить разработку и даже показывали игру на Geekcon Fest. Получили много обратной связи и, к сожалению, стало понятно, что мы не сможем предоставить более интересный опыт в рамках этой игры. Поэтому разработка игры как минимум заморожена, либо отменена совсем. Это был интересный опыт, пусть и не совсем удачный.
😢2
Что-же сейчас происходит с движком? Хороший вопрос. Изначально я хотел поработать над редактором эффектов. Увести его из QML для начала. Однако, такая переработка потянула за собой другие зависимости. Стало очевидно, что необходимо доработать редактор графов. Что-бы показывать UI элементы в самих нодах. Это очень полезное нововведение, которое пригодиться не только в эффектах, но и в других редакторах. В процессе этого рефакторинга выяснилось что у UIKit, который в движке отвечает за весь игровой UI, и который и использую для некоторых редакторов, есть различные проблемы связанные с позиционированием некоторых виджетов в иерархии других виджетов. Исправление найденных проблем заняло практически 2 недели. И теперь я практически закончил рефакторинг редактора графов! Следующая остановка это редактор эффектов.
🔥3👍1
Отличная новость. Я наконец получил возможность подписывать свои релизы благодаря SignPath и их программе для программного обеспечения с открытым исходным кодом. Осталось только разобраться как встроить его в свой CI
🔥4
Провел выходные за участием в Ludum Dare 56 на своем движке. Хакатон на данный момент еще не завершен. В месте с @tnnv_gamedev решили попробовать простенький проект в стиле Tower Defense. Он рисует, а я пишу код. В процессе работы над проектом, всплыло множество проблем. Некоторые удалось решить оперативно. А другие пополнили бэклог для решения в будущем. В целом, считаю опыт успешным. Такие мероприятия помогают взглянуть по новому на свой продукт. Я планирую закончить проект в любом случае, не зависимо от того уложимся мы или нет, и выложить его в свою библиотеку сэмплов.
❤2🔥2
Отличная новость. Я наконец прошел все проверки для возможности подписывать свои релизы. Теперь мой проект в ходит в список поддерживаемых компанией SignPath.
https://signpath.org/projects
https://signpath.org/projects
SignPath Foundation - Code Signing for Open Sor
SignPath Foundation
https://signpath.org
🔥5👍3
This media is not supported in your browser
VIEW IN TELEGRAM
Итак, сегодня замечательный повод, подвести итог эксперименту, по написанию игры для Ludum Dare джема. Да да я знаю что он прошел 3 недели назад =) но я не торопился. Для меня важно было зафиксировать как можно больше найденных проблем. Теперь-же делюсь небольшим видео игрового процесса. Игра в стиле Tower Defense. В целом эксперимент считаю удачным. Такие активности позволяют взглянуть на движок совершенно с другого ракурса. И выявить проблемы и найти новые идеи для работы.
🔥6
Мелочь, а приятно! Давно хотел добавить цветовую дифференциацию штанов осей координат. Мне очень нравилось как это сделано в блендере. Теперь такие оси есть и в моем редакторе. Так-же потратил какую-то прорву времени на исправление отображения редактора графов. Теперь масштабирование будет работать корректно.
🔥5❤2
Прошло уже больше месяца с момента моего последнего поста. Все это время я работал над пока не анонсированном крупным обновлением. Такого рода большие изменения, обычно, тянут за собой множество различных изменений поменьше, в самых разных местах. Итак, короткий дайджест изменений за прошлый месяц:
- Добавлен CheckBox виджет в UI модуль.
- Добавлен Foldout виджет в UI модуль.
- Немного переработан Frame виджет в UI модуле. Теперь он использует стандартный меш Plane для своей отрисовки (раньше каждый раз создавался отдельный меш)
- Глобальный рефакторинг модели данных отвечающих за отображения свойств объектов на сцене.
- Крупный рефакторинг редактора графов. Теперь нодам позволено определять как они будут выглядеть.
- Так-же доработана система сериализации графов. Теперь ноды сами определяют какую информацию они хотят сохранить.
- Наконец исправил проблему с рандомным крашем связанным с двойной попыткой блокировки мьютекса в базовом Object
To be continued...
- Добавлен CheckBox виджет в UI модуль.
- Добавлен Foldout виджет в UI модуль.
- Немного переработан Frame виджет в UI модуле. Теперь он использует стандартный меш Plane для своей отрисовки (раньше каждый раз создавался отдельный меш)
- Глобальный рефакторинг модели данных отвечающих за отображения свойств объектов на сцене.
- Крупный рефакторинг редактора графов. Теперь нодам позволено определять как они будут выглядеть.
- Так-же доработана система сериализации графов. Теперь ноды сами определяют какую информацию они хотят сохранить.
- Наконец исправил проблему с рандомным крашем связанным с двойной попыткой блокировки мьютекса в базовом Object
To be continued...
🔥6
Eще, я бы хотел остановиться на одной баге чуточку подробней. Я давно пытался победить низкое качество рендеринга текста у себя. Я работаю с SDF атласами глифов для отображения текста. На больших символах проблема незаметна, проблемы начинались когда текст должен быть мелким. Теперь, мне кажется, мне удалось немного улучшить ситуацию. На скрине До и После. Размер шрифта здесь 6px для строчной.
👍2🔥2
Сегодня я бы хотел рассказать о том, над чем я работаю последние несколько месяцев.
Тут должны быть фанфары, и возможно, салют. Но у меня слишком маленький бюджет.
Итак представляю вашему вниманию обновленную и переработанную систему частиц. 🔥
В чем же ее отличие спросите вы? Если коротко, она полностью переделана!
Итак расскажу как было раньше:
1. Система частиц хранилась в специальном ресурсе ParticleEffect.
2. У каждого ParticleEffect был список модификаторов определяющий поведение частиц. (Цвет, Скорость, Положение)
3. Так-же был ParticleRender компонент отвечающий за отрисовку инстанса ParticleEffect.
4. Еще был редактор похожий на анрыловский Cascade написанный на QML.
Вроде выглядит все не плохо? В целом да, но есть проблема в расширении возможностей поведения частиц!
Каждый раз когда мне необходимо добавить новый паттерн поведения, мне нужно лезть в код что-бы:
1. Добавить новый модификатор.
2. Добавить сериализацию для нового модификатора.
3. Добавить поддержку модификатора в редактор.
Так-же были определенные проблемы с перфом т.к. объект Модификатора применялся для каждой частицы.
Ну и т.к. я решил постепенно отказываться от QML, мне необходимо было перетащить редактор на что-то другое.
Еще необходимо было следить за правильной структурой буфера частиц.
Да, раньше частица представляла из себя структуру с основными параметрами (положение, цвет, размер) и промежуточными (скорость, скорость изменения размера, цвета и вращения).
Итак, я описал систему в текущей версии движка. В следующем посте я опишу обновленную систему и то, как я решил текущие ограничения.
Тут должны быть фанфары, и возможно, салют. Но у меня слишком маленький бюджет.
Итак представляю вашему вниманию обновленную и переработанную систему частиц. 🔥
В чем же ее отличие спросите вы? Если коротко, она полностью переделана!
Итак расскажу как было раньше:
1. Система частиц хранилась в специальном ресурсе ParticleEffect.
2. У каждого ParticleEffect был список модификаторов определяющий поведение частиц. (Цвет, Скорость, Положение)
3. Так-же был ParticleRender компонент отвечающий за отрисовку инстанса ParticleEffect.
4. Еще был редактор похожий на анрыловский Cascade написанный на QML.
Вроде выглядит все не плохо? В целом да, но есть проблема в расширении возможностей поведения частиц!
Каждый раз когда мне необходимо добавить новый паттерн поведения, мне нужно лезть в код что-бы:
1. Добавить новый модификатор.
2. Добавить сериализацию для нового модификатора.
3. Добавить поддержку модификатора в редактор.
Так-же были определенные проблемы с перфом т.к. объект Модификатора применялся для каждой частицы.
Ну и т.к. я решил постепенно отказываться от QML, мне необходимо было перетащить редактор на что-то другое.
Еще необходимо было следить за правильной структурой буфера частиц.
Да, раньше частица представляла из себя структуру с основными параметрами (положение, цвет, размер) и промежуточными (скорость, скорость изменения размера, цвета и вращения).
Итак, я описал систему в текущей версии движка. В следующем посте я опишу обновленную систему и то, как я решил текущие ограничения.
🎉6
А теперь расскажу, что было сделано в новой системе.
При разработке всех фич движка, я всегда исхожу из данных с которыми предстоит работать той, или иной фиче. Так, что этот пост будет посвящен данным.
Как уже было сказано ранее, данные частицы хранились в отдельной структуре, которая была довольно неповоротлива в обслуживании и расширении.
Что, если мне не нужны какие то данные для эффекта или мне нужно добавить новые поля для хранения?
Я обратил внимание на то, что структура по своей сути состоит из набора float и vec различной размерности (vec2, vec3, vec4).
И тут меня осенило! А что если сделать плоский буфер float значений. У этого подхода есть ряд очевидных плюсов:
1. Структура может быть подвижной! Мы можем не задумываться какие данные мы хотим там хранить!
2. Очень плотное выравнивание! Нет больше проблем с выравниванием памяти в структуре. Все данные будут храниться очень плотно, что положительно скажется на потреблении и скорости доступа к данным.
3. Буфер передаваемый в GPU тоже состоит из набора float'ов, а значит все это можно унифицировать.
Очевидно, у такого подхода есть и жирный минус. Связан он с определенным неудобством доступа к ячейке параметра в виде необходимости хранить оффсеты. Однако это можно нивелировать на уровне редактора.
А дальше Остапа понесло! В следующем посте я расскажу, как переделал систему модификаторов исходя из новой формы хранения данных.
При разработке всех фич движка, я всегда исхожу из данных с которыми предстоит работать той, или иной фиче. Так, что этот пост будет посвящен данным.
Как уже было сказано ранее, данные частицы хранились в отдельной структуре, которая была довольно неповоротлива в обслуживании и расширении.
Что, если мне не нужны какие то данные для эффекта или мне нужно добавить новые поля для хранения?
Я обратил внимание на то, что структура по своей сути состоит из набора float и vec различной размерности (vec2, vec3, vec4).
И тут меня осенило! А что если сделать плоский буфер float значений. У этого подхода есть ряд очевидных плюсов:
1. Структура может быть подвижной! Мы можем не задумываться какие данные мы хотим там хранить!
2. Очень плотное выравнивание! Нет больше проблем с выравниванием памяти в структуре. Все данные будут храниться очень плотно, что положительно скажется на потреблении и скорости доступа к данным.
3. Буфер передаваемый в GPU тоже состоит из набора float'ов, а значит все это можно унифицировать.
Очевидно, у такого подхода есть и жирный минус. Связан он с определенным неудобством доступа к ячейке параметра в виде необходимости хранить оффсеты. Однако это можно нивелировать на уровне редактора.
А дальше Остапа понесло! В следующем посте я расскажу, как переделал систему модификаторов исходя из новой формы хранения данных.
🔥5
В прошлом посте мы разобрали новую модель хранения данных об атрибутах частиц (положение, цвет, размер и т.д).
Теперь поговорим о самой важной части новой системы частиц, о том как происходит пересчет атрибутов и их сбор для отрисовки на GPU.
Ранее изменение атрибутов производилось с помощью специальных сущностей "ParticleModificator". Теперь их больше нет. Долой теранию Модификаторов! Всю власть Операторам!
Так стоп! Скажите вы, "Что за Операторы? И в чем разница?" Все очень просто!
Раньше как выглядел пайплайн. Мы передавали структуру частицы в каскад модификаторов. Модификатор, как правило, производил очень простую операцию.
Скажем:
Для этого нам нужно было для каждой частицы вызывать виртуальный метод модификатора поститать и пройти к следующему модификатору. Вы, конечно, можете заметить что можно вызывать один раз для всего пула частиц. На что я паррирую, что были корнер кейсы которые делали такой подход жутко неудобным.
Теперь же сама суть действия:
Может быть разделена на 2 операции:
Эти 2 операции легко сериализуются как:
1. Тип операции
2. Набор из двух аргументов над которыми будет произведена операция (тут могут быть разные области откуда берутся данные для аргументов)
3. И оффсет куда нужно положить результат.
Вот и все! Почти ассемблерные инструкции! Редактор формирует цепочки таких Операторов на исполнение и сериализует его в новый вид ресурса VisualEffect бывший ParticleEffect.
Далее, мы каждую итерацию пропускаем через цепочку операторов все частицы и наслаждаемся супер гибкостью получившейся системы!
Самое интересное, что этот подход позволяет обновлять состояние не только частиц но и самого эмиттера, а так-же формировать компактные буферы для отправления на GPU
Так-же, очень приятным бонусом будет возможность без проблем сформировать Compute Shader, что позволит, в будущем, делать симуляцию частиц на GPU (там где это возможно).
Теперь поговорим о самой важной части новой системы частиц, о том как происходит пересчет атрибутов и их сбор для отрисовки на GPU.
Ранее изменение атрибутов производилось с помощью специальных сущностей "ParticleModificator". Теперь их больше нет. Долой теранию Модификаторов! Всю власть Операторам!
Так стоп! Скажите вы, "Что за Операторы? И в чем разница?" Все очень просто!
Раньше как выглядел пайплайн. Мы передавали структуру частицы в каскад модификаторов. Модификатор, как правило, производил очень простую операцию.
Скажем:
position += velocity * deltaTime
Для этого нам нужно было для каждой частицы вызывать виртуальный метод модификатора поститать и пройти к следующему модификатору. Вы, конечно, можете заметить что можно вызывать один раз для всего пула частиц. На что я паррирую, что были корнер кейсы которые делали такой подход жутко неудобным.
Теперь же сама суть действия:
position += velocity * deltaTime
Может быть разделена на 2 операции:
1. local = velocity * deltaTime
2. position = position + local
Эти 2 операции легко сериализуются как:
1. Тип операции
2. Набор из двух аргументов над которыми будет произведена операция (тут могут быть разные области откуда берутся данные для аргументов)
3. И оффсет куда нужно положить результат.
Вот и все! Почти ассемблерные инструкции! Редактор формирует цепочки таких Операторов на исполнение и сериализует его в новый вид ресурса VisualEffect бывший ParticleEffect.
Далее, мы каждую итерацию пропускаем через цепочку операторов все частицы и наслаждаемся супер гибкостью получившейся системы!
Самое интересное, что этот подход позволяет обновлять состояние не только частиц но и самого эмиттера, а так-же формировать компактные буферы для отправления на GPU
Так-же, очень приятным бонусом будет возможность без проблем сформировать Compute Shader, что позволит, в будущем, делать симуляцию частиц на GPU (там где это возможно).
🔥3
Итак, это последний пост из серии, посвященной обновленной системе частиц.
В этой части я бы хотел поговорить о редакторе. Как я уже говорил ранее, я отказываюсь от QML. Поэтому я решил попробовать свой UI Framework для этой цели. Благо, у меня уже был опыт по созданию редактора графов на нем.
За основу был взят UI/UX редактора эффектов Niagara из UE5. Разумеется, их редактор имеет гораздо больше возможностей, чем мой на старте. Однако, я пока только в начале пути.
Формат хранения ассета это переработанный и дополненный формат хранения графов. XML формат обеспечивает компактное и VCS friendly представление.
Так-же как и в редакторе материалов, в редакторе эффектов есть возможность создавать кастомные блоки для добавления в редактор (То-же XML).
На этом свою миссию по обновлению редактора эффектов считаю выполненной. Однако я продолжу исследование, получившейся архитектуры в будущем. И обязательно продолжу добавлять новый функционал в редактор!
В этой части я бы хотел поговорить о редакторе. Как я уже говорил ранее, я отказываюсь от QML. Поэтому я решил попробовать свой UI Framework для этой цели. Благо, у меня уже был опыт по созданию редактора графов на нем.
За основу был взят UI/UX редактора эффектов Niagara из UE5. Разумеется, их редактор имеет гораздо больше возможностей, чем мой на старте. Однако, я пока только в начале пути.
Формат хранения ассета это переработанный и дополненный формат хранения графов. XML формат обеспечивает компактное и VCS friendly представление.
Так-же как и в редакторе материалов, в редакторе эффектов есть возможность создавать кастомные блоки для добавления в редактор (То-же XML).
На этом свою миссию по обновлению редактора эффектов считаю выполненной. Однако я продолжу исследование, получившейся архитектуры в будущем. И обязательно продолжу добавлять новый функционал в редактор!
🔥2
Когда разрабатываешь кросс платформенный движок, очень важно держать в голове особенности различных платформ. Так и сегодня столкнулся с забавным багом связанным с различиями в реализации хэширования строк.
Ни для кого не секрет, что поиск по хэшу происходит намного быстрей. Соответственно очень важна консистентность. Бага заключалась в том, что я при конвертации ассетов на Windows сохранял хэши в файл, а потом их загружал в webassembly.
Потом же я обращался к кэшу через хэширование строки уже на стороне webassembly. Из за различий в реализации функции хэширования, значения созданные на Windows не совпадали со значениями созданными на Webassembly, из за этого движок не мог найти нужный ресурс.
В конечном итоге я решил просто использовать свою функцию вычисления хэша для строки. Которая гарантированно будет выдавать одинаковый результат на всех платформах.
Ни для кого не секрет, что поиск по хэшу происходит намного быстрей. Соответственно очень важна консистентность. Бага заключалась в том, что я при конвертации ассетов на Windows сохранял хэши в файл, а потом их загружал в webassembly.
Потом же я обращался к кэшу через хэширование строки уже на стороне webassembly. Из за различий в реализации функции хэширования, значения созданные на Windows не совпадали со значениями созданными на Webassembly, из за этого движок не мог найти нужный ресурс.
В конечном итоге я решил просто использовать свою функцию вычисления хэша для строки. Которая гарантированно будет выдавать одинаковый результат на всех платформах.
🔥1🤔1