Тренируюсь в написании GLSL шейдеров. В качестве игрового движка взял defold engine https://defold.com/
Что реализовано:
1. Displacement
2. Отложенное освещение
3.Нормали
4. SSAO
5. Простые пост-эффекты, такие как постеризация и рыбий глаз
TODO:
Хочется разнообразить сцену, добавить больше пропсов. Добавить тени от источников освещения.
Что реализовано:
1. Displacement
2. Отложенное освещение
3.Нормали
4. SSAO
5. Простые пост-эффекты, такие как постеризация и рыбий глаз
TODO:
Хочется разнообразить сцену, добавить больше пропсов. Добавить тени от источников освещения.
Defold game engine
Defold - Official Homepage - Cross platform game engine
Defold is a free and open game engine used for development of console, desktop, mobile and web games.
👍1🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Вот так я сделал отложенное освещение. Проще говоря, это метод рендеринга, где сначала сохраняется информация о пикселях сцены, а потом применяется освещение. Это позволяет эффективно управлять множеством источников света, но требует больше памяти.
Как видно тут рендерятся сразу за один проход 3 карты
Карта нормалей: Хранит направление нормалей для каждого пикселя, используемое для расчета освещения.
Карта позиций: Содержит пространственные координаты каждого пикселя для точного вычисления освещения.
Карта albedo: Хранит базовый цвет поверхности без учета освещения, используемый как основной цветовой компонент.
Вроде бы всё просто, но с момента когда я услышал про этот подход прошло больше 10 лет, всё мозгов не хватало понять как это работает 😅
Как видно тут рендерятся сразу за один проход 3 карты
Карта нормалей: Хранит направление нормалей для каждого пикселя, используемое для расчета освещения.
Карта позиций: Содержит пространственные координаты каждого пикселя для точного вычисления освещения.
Карта albedo: Хранит базовый цвет поверхности без учета освещения, используемый как основной цветовой компонент.
Вроде бы всё просто, но с момента когда я услышал про этот подход прошло больше 10 лет, всё мозгов не хватало понять как это работает 😅
🔥4👍1
Media is too big
VIEW IN TELEGRAM
Недавно мне захотелось попробовать создать источники освещения с эффектом "тумана". Я наткнулся на статью, которая вдохновила меня на реализацию этой идеи: https://ijdykeman.github.io/graphics/simple_fog_shader Результат превзошел мои ожидания — эффект получился действительно впечатляющим! Самое классное, что это не просто спрайт, а полноценный эффект. Если умело интегрировать это в сцену, можно добиться потрясающей красоты.
Для лучшей видимости эффекта я увеличил свечение в два раза
Для лучшей видимости эффекта я увеличил свечение в два раза
🔥3👍2
Media is too big
VIEW IN TELEGRAM
Разработка на Defold часто начинается с чувством, что сталкиваешься с постоянными ограничениями. То, что в других движках можно реализовать за пару часов, в Defold требует написания низкоуровневых решений и интеграции их в пайплайн рендера, а также архитектуру проекта, жестко диктуемую движком. Изоляция работы с GUI, миром и рендер-скриптами тоже накладывает свои ограничения. Но знаете что? Это здорово! 👍 У меня гораздо меньше шансов упороться в спагетти код, мне движок это просто не позволит. Эти сложности способствуют созданию более оптимизированного и чистого кода. Благодаря таким особенностям Defold игры на этом движке часто отличаются высокой производительностью. Любые затраченные усилия обязательно окупаются, и я восхищаюсь результатами, которых удается достичь с его помощью.
Что касается того, что я успел реализовать: наконец, я реализовал тени от точечного источника освещения — давно хотел это сделать! Даже эффект туманности до сих пор меня впечатляет, а добавление теней стало приятным дополнением. В последнее время разработчики Defold сделали большой шаг вперед в работе с шейдерами, и благодаря этому реализовать свои задумки стало гораздо проще. Надеюсь, вскоре появятся новые структуры данных, такие как массив сэмплеров или возможность динамически создавать кубические карты и рендерить в них. Ну а пока работаем с тем, что есть, и наслаждаемся процессом!
Что касается того, что я успел реализовать: наконец, я реализовал тени от точечного источника освещения — давно хотел это сделать! Даже эффект туманности до сих пор меня впечатляет, а добавление теней стало приятным дополнением. В последнее время разработчики Defold сделали большой шаг вперед в работе с шейдерами, и благодаря этому реализовать свои задумки стало гораздо проще. Надеюсь, вскоре появятся новые структуры данных, такие как массив сэмплеров или возможность динамически создавать кубические карты и рендерить в них. Ну а пока работаем с тем, что есть, и наслаждаемся процессом!
👍9🔥4
Media is too big
VIEW IN TELEGRAM
Хочу поделиться крутой находкой: На основе предыдущих наработок сделал объемные тени, и это оказалось проще, чем кажется!
Идея такая: Я использовал луч от фрагмента к камере и взял выборку вдоль него по карте теней. Вуаля, эффект готов!
Правда, производительность пока страдает, но я не сдаюсь и верю, что найду способ это оптимизировать. Если у кого-то есть мысли или идеи, как улучшить эффект – пишите, буду рад обсудить!
Идея такая: Я использовал луч от фрагмента к камере и взял выборку вдоль него по карте теней. Вуаля, эффект готов!
Правда, производительность пока страдает, но я не сдаюсь и верю, что найду способ это оптимизировать. Если у кого-то есть мысли или идеи, как улучшить эффект – пишите, буду рад обсудить!
🔥5👍2
Привет, народ! Помимо написания шейдеров в свободное время, в реальности я еще немного DS :D И заготовил для вас развлекательный пост 😄 Этот анализ ниже - чисто экспериментальный и не претендует на точность или практическую применимость. Я провел его из личного интереса к символьной регрессии и любви к поиску математических закономерностей в данных. Рассматривайте это как увлекательное исследование, а не как серьезную прогностическую модель.
Решил я тут поэкспериментировать с интересной штукой - символьной регрессией. Вообще существуют такие решения, которые могут аппроксимировать данные и выдать формулу например для будущих предсказаний.
Меня осенило попробовать предсказать продажи игр на основе разных метрик.
Для анализа был сформирован обезличенный датасет из 50 строк, включающий следующие признаки: жанр (кодированный категориальный), бюджет (в млн $), длительность (в часах), оценка критиков (по 100-балльной шкале), наличие мультиплеера (бинарный) и объем продаж (в млн копий). Структура данных выглядела следующим образом:
Жанр,Бюджет,Длительность,Оценка_критиков,Мультиплеер,Продажи
1,50,40,85,0,2.5
2,30,10,75,1,1.8
3,15,100,70,0,0.9
...
Где первый столбец Жанр, там указаны просто коды жанров, например:
1: RPG
2: Шутер
3: Симулятор
Для анализа использовал TuringBot (https://turingbotsoftware.com/) - крутую, но платную программу (у меня, к счастью, есть лицензия). Загрузил туда свой датасет, указал входные переменные и целевое значение. Данные были разделены на обучающую и тестовую выборки в соотношении 50/50 для проведения кросс-валидации. В качестве целевой метрики оптимизации использовалось среднеквадратичное отклонение (RMSE).
После 5 минут работы программа выдала оптимальную формулу. Она отлично справилась с тренировочными данными и более-менее с тестовыми. Главное - удалось найти зависимости между входными параметрами и продажами. Казалось бы, полученная формула отражает нелинейные зависимости между входными параметрами и объемом продаж, учитывая взаимодействия между признаками и теперь у нас есть "формула мечты" для прогнозирования доходов 😄 (Рисунок 1)
Но не все так круто 🙈 На тестовых данных формула уже не так красиво себя вела Рисунок 2. Тут играет куча причин, например:
- Малый размер выборки (n=50) повышает риск переобучения модели.
- Наблюдается сильная корреляция между бюджетом и оценками критиков
- Категориальный признак "жанр" закодирован числовыми значениями, что может некорректно отражать его влияние. но опять же это решается размером датасета
Но хочу подчеркнуть - даже сейчас "модель" предсказала верную тенденцию на данных, которые не участвовали в обучении. Но и тут мне надо бы осторожным по причинам описанным выше.
В заключение хочу отметить, что символьная регрессия, несмотря на свою "классичность", остается мощным инструментом. Она позволяет получать интерпретируемые модели и выявлять неочевидные закономерности в данных. Хотя современные методы глубокого обучения часто превосходят ее по точности, символьная регрессия сохраняет свою ценность в задачах, требующих прозрачности и объяснимости модели. Например мне будет приятно использовать формулу отлично решающую определенную задачу, чем инференсить pytorch модели. Лично я нахожу работу с этим методом крайне увлекательной, особенно в контексте исследовательского анализа данных и генерации гипотез, как то так 💪
Кстати, а вот и формула 😂
Решил я тут поэкспериментировать с интересной штукой - символьной регрессией. Вообще существуют такие решения, которые могут аппроксимировать данные и выдать формулу например для будущих предсказаний.
Меня осенило попробовать предсказать продажи игр на основе разных метрик.
Для анализа был сформирован обезличенный датасет из 50 строк, включающий следующие признаки: жанр (кодированный категориальный), бюджет (в млн $), длительность (в часах), оценка критиков (по 100-балльной шкале), наличие мультиплеера (бинарный) и объем продаж (в млн копий). Структура данных выглядела следующим образом:
Жанр,Бюджет,Длительность,Оценка_критиков,Мультиплеер,Продажи
1,50,40,85,0,2.5
2,30,10,75,1,1.8
3,15,100,70,0,0.9
...
Где первый столбец Жанр, там указаны просто коды жанров, например:
1: RPG
2: Шутер
3: Симулятор
Для анализа использовал TuringBot (https://turingbotsoftware.com/) - крутую, но платную программу (у меня, к счастью, есть лицензия). Загрузил туда свой датасет, указал входные переменные и целевое значение. Данные были разделены на обучающую и тестовую выборки в соотношении 50/50 для проведения кросс-валидации. В качестве целевой метрики оптимизации использовалось среднеквадратичное отклонение (RMSE).
После 5 минут работы программа выдала оптимальную формулу. Она отлично справилась с тренировочными данными и более-менее с тестовыми. Главное - удалось найти зависимости между входными параметрами и продажами. Казалось бы, полученная формула отражает нелинейные зависимости между входными параметрами и объемом продаж, учитывая взаимодействия между признаками и теперь у нас есть "формула мечты" для прогнозирования доходов 😄 (Рисунок 1)
Но не все так круто 🙈 На тестовых данных формула уже не так красиво себя вела Рисунок 2. Тут играет куча причин, например:
- Малый размер выборки (n=50) повышает риск переобучения модели.
- Наблюдается сильная корреляция между бюджетом и оценками критиков
- Категориальный признак "жанр" закодирован числовыми значениями, что может некорректно отражать его влияние. но опять же это решается размером датасета
Но хочу подчеркнуть - даже сейчас "модель" предсказала верную тенденцию на данных, которые не участвовали в обучении. Но и тут мне надо бы осторожным по причинам описанным выше.
В заключение хочу отметить, что символьная регрессия, несмотря на свою "классичность", остается мощным инструментом. Она позволяет получать интерпретируемые модели и выявлять неочевидные закономерности в данных. Хотя современные методы глубокого обучения часто превосходят ее по точности, символьная регрессия сохраняет свою ценность в задачах, требующих прозрачности и объяснимости модели. Например мне будет приятно использовать формулу отлично решающую определенную задачу, чем инференсить pytorch модели. Лично я нахожу работу с этим методом крайне увлекательной, особенно в контексте исследовательского анализа данных и генерации гипотез, как то так 💪
Кстати, а вот и формула 😂
def solution(Жанр, Бюджет, Длительность, Оценка_критиков, Мультиплеер):
return 0.06699618899317092*(0.686980117635591/(tan(Оценка_критиков)-1.640619407832785*Мультиплеер)+Оценка_критиков-74.61041769134356+Бюджет+(6.434509049049919-atanh(sin(Мультиплеер*(Длительность-Жанр)-0.1417795805275835)))*(Мультиплеер-cos(round((0.9990760411584179+erf(Мультиплеер))*Жанр+Оценка_критиков))))
🔥6👍4
Media is too big
VIEW IN TELEGRAM
Что же я успел сделать?)
Мало кто знает, но для создания своей "Игры мечты" помимо шейдеров я разрабатываю собственную библиотеку для создания пользовательских интерфейсов на игровом движке Defold. Вдохновляясь библиотекой React.js для веба, я делю интерфейс на шаблоны, макеты, умные и глупые компоненты. Это позволяет конструировать интерфейсы почти так же, как с помощью HTML-разметки, и рендерить их с использованием компонентов со своим состоянием и так далее. Я также разрабатываю аналог CSS для описания стилей.
Теперь к сути дела: у CSS есть свойство backdrop-filter, позволяющее применять различные эффекты к области позади UI-элемента. И вот на выходных я реализовал его в своей библиотеке! Теперь достаточно указать backdropFilter="blur(10px)" в стилях элемента, и все заработает. По сути, это послойный рендеринг, требующий немного больше вызовов отрисовки, но эффект того стоит. Механизм внутри рендер-скрипта автоматически разделяет интерфейс на нужные слои, основываясь на стилях. Этот подход мне достался с тех пор, когда я внедрил механизм клиппинга 💪
Кстати бонусом еще сделал анимации при наведении. Т.к. мне недоступен реальный css с транзишенами, я реализовал что то типа useAnimatedState как аналог useState из react.js
Мало кто знает, но для создания своей "Игры мечты" помимо шейдеров я разрабатываю собственную библиотеку для создания пользовательских интерфейсов на игровом движке Defold. Вдохновляясь библиотекой React.js для веба, я делю интерфейс на шаблоны, макеты, умные и глупые компоненты. Это позволяет конструировать интерфейсы почти так же, как с помощью HTML-разметки, и рендерить их с использованием компонентов со своим состоянием и так далее. Я также разрабатываю аналог CSS для описания стилей.
Теперь к сути дела: у CSS есть свойство backdrop-filter, позволяющее применять различные эффекты к области позади UI-элемента. И вот на выходных я реализовал его в своей библиотеке! Теперь достаточно указать backdropFilter="blur(10px)" в стилях элемента, и все заработает. По сути, это послойный рендеринг, требующий немного больше вызовов отрисовки, но эффект того стоит. Механизм внутри рендер-скрипта автоматически разделяет интерфейс на нужные слои, основываясь на стилях. Этот подход мне достался с тех пор, когда я внедрил механизм клиппинга 💪
Кстати бонусом еще сделал анимации при наведении. Т.к. мне недоступен реальный css с транзишенами, я реализовал что то типа useAnimatedState как аналог useState из react.js
👍6🔥5
Недавно Жена мне подарила на день рождения книгу Джесси Шелла "Гейм Дизайн". Но... этому предшествовало мое глубокое разочарование в индустрии онлайн-курсов 🙈
Изначально я искал комплексную информацию о геймдизайне: что это такое, с чем его "едят", причем не только для новичков. Однако обнаружил, что большинство курсов, даже если они называются "Геймдизайн", на самом деле фокусируются на базовом программировании, изучении игровых движков и создании простейших платформеров. Мое разочарование усиливалось тем, что индустрия онлайн-образования, похоже, ориентирована на массового потребителя, предлагая поверхностные знания по принципу "галопом по Европам". Вместо глубокого погружения в психологию игрока, методы создания эмоционального отклика и способы трансляции нужного опыта, курсы предлагали лишь техническую сторону вопроса: "на какую кнопочку нажать, чтобы создать проект в Unity".
А я всего лишь искал более глубокое понимание геймдизайна как искусства создания увлекательного игрового опыта, а не просто набор технических навыков.
Похоже, я был настолько увлечён, что моя любимая решила изучить все статьи на хабре, посетить тематические форумы и узнать, что советуют люди. В результате теперь каждый день перед сном я читаю охренительную книгу. 🔥
Изначально я искал комплексную информацию о геймдизайне: что это такое, с чем его "едят", причем не только для новичков. Однако обнаружил, что большинство курсов, даже если они называются "Геймдизайн", на самом деле фокусируются на базовом программировании, изучении игровых движков и создании простейших платформеров. Мое разочарование усиливалось тем, что индустрия онлайн-образования, похоже, ориентирована на массового потребителя, предлагая поверхностные знания по принципу "галопом по Европам". Вместо глубокого погружения в психологию игрока, методы создания эмоционального отклика и способы трансляции нужного опыта, курсы предлагали лишь техническую сторону вопроса: "на какую кнопочку нажать, чтобы создать проект в Unity".
А я всего лишь искал более глубокое понимание геймдизайна как искусства создания увлекательного игрового опыта, а не просто набор технических навыков.
Похоже, я был настолько увлечён, что моя любимая решила изучить все статьи на хабре, посетить тематические форумы и узнать, что советуют люди. В результате теперь каждый день перед сном я читаю охренительную книгу. 🔥
👍5🔥4
Что по ценам нынче?
Вчера ночью нанял профессионального 3D-артиста смоделировать персонажа. С помощью нейросети я набросал примерное видение временного ГГ, которым буду управлять. Нейросеть выдала нужный вариант с попытки сотой, наверное, но даже при этом есть косяки, которые я решил исправить через ТЗ. Вообще все недочеты и лишние детали можно пофиксить через inpaint, но этим я решил не заморачиваться.
Выбирая профессионала, я исходил из того, насколько хорошо исполнитель владеет кисточкой, так как хотелось стилизацию и качественную прорисовку текстур. Итого из всего многообразия выбрал для себя 2 претендентов:
Один берет 35 тыс. рублей
Второй 20 тыс. рублей
Спойлер: выбрал того, что дешевле, и считаю это разумным. Я бы заплатил и 35, тем более у него работы гораздо серьезнее, но исполнитель был сильно перегружен, и мне не хотелось терять время, ожидая, когда до меня дойдет очередь.
В итоге взял исполнителя, который берет 20 тысяч, что считаю очень и очень мало, но человек действительно выдает хороший результат, и я дал ему шанс.
Прикладываю к посту мой образ, который я хочу) В будущем мне предстоит еще найти человека, который сделает риг 😆 Ну, вообще я и сам могу, но учусь уже делегировать задачи, время на выполнение которых я лучше потрачу на основную работу.
Вчера ночью нанял профессионального 3D-артиста смоделировать персонажа. С помощью нейросети я набросал примерное видение временного ГГ, которым буду управлять. Нейросеть выдала нужный вариант с попытки сотой, наверное, но даже при этом есть косяки, которые я решил исправить через ТЗ. Вообще все недочеты и лишние детали можно пофиксить через inpaint, но этим я решил не заморачиваться.
Выбирая профессионала, я исходил из того, насколько хорошо исполнитель владеет кисточкой, так как хотелось стилизацию и качественную прорисовку текстур. Итого из всего многообразия выбрал для себя 2 претендентов:
Один берет 35 тыс. рублей
Второй 20 тыс. рублей
Спойлер: выбрал того, что дешевле, и считаю это разумным. Я бы заплатил и 35, тем более у него работы гораздо серьезнее, но исполнитель был сильно перегружен, и мне не хотелось терять время, ожидая, когда до меня дойдет очередь.
В итоге взял исполнителя, который берет 20 тысяч, что считаю очень и очень мало, но человек действительно выдает хороший результат, и я дал ему шанс.
Прикладываю к посту мой образ, который я хочу) В будущем мне предстоит еще найти человека, который сделает риг 😆 Ну, вообще я и сам могу, но учусь уже делегировать задачи, время на выполнение которых я лучше потрачу на основную работу.
🔥8👍3
martianov_dev
Что по ценам нынче? Вчера ночью нанял профессионального 3D-артиста смоделировать персонажа. С помощью нейросети я набросал примерное видение временного ГГ, которым буду управлять. Нейросеть выдала нужный вариант с попытки сотой, наверное, но даже при этом…
#Субботний
Со мной случилась забавная история. Помните, я рассказывал, что выбрал двух исполнителей для моделирования моего персонажа? В итоге я остановился на первом мастере по нескольким причинам, но суть не в этом. Дело в том, что второй мастер (который заметно дороже) неожиданно начал работать над проектом без нашего согласования. Он даже успел сделать черновой вариант 3D-модели и отправил мне сообщение: мол, смотри, уже работаю, уточню несколько деталей. При этом мы ещё вообще не обсуждали начало работы!
Несмотря на то, что изначально я планировал отдать проект первому мастеру, я всё-таки решил дать и второму ту же задачу. Неделю спустя он прислал мне готовые рендеры персонажа – и они оказались просто офигенными! Прикол в том, что я тогда ещё даже не заплатил ему ни копейки, включая аванс. Но, конечно, потом я полностью рассчитался и оставил положительный отзыв. Работа получилась на высшем уровне: ретопология, hand-paint текстуры – всё сделано идеально. Теперь осталось дождаться результата от первого мастера и сравнить подход двух разных специалистов к одному техническому заданию.
Как только получу результат от другого мастера, то сразу запилю сравнение 👍
Со мной случилась забавная история. Помните, я рассказывал, что выбрал двух исполнителей для моделирования моего персонажа? В итоге я остановился на первом мастере по нескольким причинам, но суть не в этом. Дело в том, что второй мастер (который заметно дороже) неожиданно начал работать над проектом без нашего согласования. Он даже успел сделать черновой вариант 3D-модели и отправил мне сообщение: мол, смотри, уже работаю, уточню несколько деталей. При этом мы ещё вообще не обсуждали начало работы!
Несмотря на то, что изначально я планировал отдать проект первому мастеру, я всё-таки решил дать и второму ту же задачу. Неделю спустя он прислал мне готовые рендеры персонажа – и они оказались просто офигенными! Прикол в том, что я тогда ещё даже не заплатил ему ни копейки, включая аванс. Но, конечно, потом я полностью рассчитался и оставил положительный отзыв. Работа получилась на высшем уровне: ретопология, hand-paint текстуры – всё сделано идеально. Теперь осталось дождаться результата от первого мастера и сравнить подход двух разных специалистов к одному техническому заданию.
Как только получу результат от другого мастера, то сразу запилю сравнение 👍
👍6🔥3