Как нейросеть восстанавливает свет от объектов за пределами кадра
Экранные методы глобального освещения быстры, но не видят геометрию вне камеры. В подходе AMD карты отражений строятся со стороны каждого источника света. Их тексели становятся виртуальными источниками непрямого света, поэтому модель получает сведения об объектах за границей кадра.
К экранным буферам добавляют шумную оценку одного отражения на пиксель. Модуль внимания связывает геометрию пикселя с данными о свете, а отдельные декодеры восстанавливают рассеянную и зеркальную составляющие непрямого освещения.
Модель из технического разбора AMD содержит 2,19 млн параметров и без оптимизации, в FP32 PyTorch, обрабатывает кадр 512×512 за 45,56 мс на MI250. Для разработчиков рендеринга это ориентир для экспериментов с входными данными, но пока не готовый способ получить кадровую частоту реального времени.
Экранные методы глобального освещения быстры, но не видят геометрию вне камеры. В подходе AMD карты отражений строятся со стороны каждого источника света. Их тексели становятся виртуальными источниками непрямого света, поэтому модель получает сведения об объектах за границей кадра.
К экранным буферам добавляют шумную оценку одного отражения на пиксель. Модуль внимания связывает геометрию пикселя с данными о свете, а отдельные декодеры восстанавливают рассеянную и зеркальную составляющие непрямого освещения.
Модель из технического разбора AMD содержит 2,19 млн параметров и без оптимизации, в FP32 PyTorch, обрабатывает кадр 512×512 за 45,56 мс на MI250. Для разработчиков рендеринга это ориентир для экспериментов с входными данными, но пока не готовый способ получить кадровую частоту реального времени.
❤3👎1
Как разделить управление меню и персонажем в Unity Input System
Если меню и игровой процесс слушают ввод одновременно, пробел может подтвердить пункт и тут же заставить персонажа прыгнуть. Action Maps разделяют контексты: при открытии меню игровую карту отключают, а карту интерфейса включают.
Для локального мультиплеера PlayerInput создаёт отдельный набор действий каждому игроку и динамически связывает устройства. Отдельный менеджер переназначения держит активной только одну операцию и временно отключает обработчики, поэтому два окна настройки не перехватывают одну кнопку.
Архитектура ввода Mega Cat Studios дополняет эту схему центральным менеджером: он переключает карты действий, подписывается на события и обрабатывает смену устройств. Такой фундамент упрощает добавление новых меню, схем управления и локальных игроков без каскада проверок по всему коду.
Если меню и игровой процесс слушают ввод одновременно, пробел может подтвердить пункт и тут же заставить персонажа прыгнуть. Action Maps разделяют контексты: при открытии меню игровую карту отключают, а карту интерфейса включают.
Для локального мультиплеера PlayerInput создаёт отдельный набор действий каждому игроку и динамически связывает устройства. Отдельный менеджер переназначения держит активной только одну операцию и временно отключает обработчики, поэтому два окна настройки не перехватывают одну кнопку.
Архитектура ввода Mega Cat Studios дополняет эту схему центральным менеджером: он переключает карты действий, подписывается на события и обрабатывает смену устройств. Такой фундамент упрощает добавление новых меню, схем управления и локальных игроков без каскада проверок по всему коду.
❤4
Как собрать toon-шейдер для VR в Unity URP
В Shmackle VR базовые Unlit-шейдеры давали плоскую картинку и нестабильные 70 FPS на Quest 2. Автор собрал систему из трёх частей: ступенчатого света, экранных контуров и краевого освещения, которое отделяет силуэт от фона.
Свет квантуется по скалярному произведению нормали и направления на источник: плавный градиент превращается в несколько уровней. Для дальних объектов расчёт переносится с пикселей на вершины по уровню детализации. Контуры ищутся фильтром Собеля в буферах глубины и нормалей, поэтому отдельная геометрия не нужна.
В проекте автора частота закрепилась на 90 FPS, вызовы отрисовки сократились с 340+ до 180, а варианты шейдера с 12 до 4. Это ориентир, а не гарантия: архитектуру и код прохода контуров стоит проверять профилированием прямо на целевом шлеме.
В Shmackle VR базовые Unlit-шейдеры давали плоскую картинку и нестабильные 70 FPS на Quest 2. Автор собрал систему из трёх частей: ступенчатого света, экранных контуров и краевого освещения, которое отделяет силуэт от фона.
Свет квантуется по скалярному произведению нормали и направления на источник: плавный градиент превращается в несколько уровней. Для дальних объектов расчёт переносится с пикселей на вершины по уровню детализации. Контуры ищутся фильтром Собеля в буферах глубины и нормалей, поэтому отдельная геометрия не нужна.
В проекте автора частота закрепилась на 90 FPS, вызовы отрисовки сократились с 340+ до 180, а варианты шейдера с 12 до 4. Это ориентир, а не гарантия: архитектуру и код прохода контуров стоит проверять профилированием прямо на целевом шлеме.
❤1
Как сделать процедурные уровни разнообразнее, ограничивая случайность
Если генератор независимо выбирает каждый объект, цвет и размер, результаты формально уникальны, но быстро сливаются в один шаблон. Мозг усредняет множество мелких различий, поэтому игроку сложнее запоминать регионы и ориентиры.
Помогают несколько крупных решений на уровень: выбрать ограниченную палитру и набор форм, связать свойства объектов, а редкие особенности включать отдельными переключателями логики. Для большой карты те же решения можно распределять по областям, построенным через диаграмму Вороного или рекурсивное деление, и смешивать на границах.
В интерактивных примерах генератора видно, как ограничения создают заметные варианты без добавления нового контента. Иногда генератору действительно полезно дать меньше свободы.
Если генератор независимо выбирает каждый объект, цвет и размер, результаты формально уникальны, но быстро сливаются в один шаблон. Мозг усредняет множество мелких различий, поэтому игроку сложнее запоминать регионы и ориентиры.
Помогают несколько крупных решений на уровень: выбрать ограниченную палитру и набор форм, связать свойства объектов, а редкие особенности включать отдельными переключателями логики. Для большой карты те же решения можно распределять по областям, построенным через диаграмму Вороного или рекурсивное деление, и смешивать на границах.
В интерактивных примерах генератора видно, как ограничения создают заметные варианты без добавления нового контента. Иногда генератору действительно полезно дать меньше свободы.
❤2
Как собрать патрулирование, погоню и атаку врага в Godot 4
Вместо одного контроллера с каскадом условий поведение 3D-врага делится на состояния: ожидание, патруль, погоню, атаку и реакцию на попадание. Каждое состояние выполняет свою задачу и само решает, когда передать управление следующему.
В основе врага находится
Разбор 3D-врага в Godot 4 показывает структуру сцены и код состояний. Перед запуском нужно добавить в уровень
Вместо одного контроллера с каскадом условий поведение 3D-врага делится на состояния: ожидание, патруль, погоню, атаку и реакцию на попадание. Каждое состояние выполняет свою задачу и само решает, когда передать управление следующему.
В основе врага находится
CharacterBody3D. NavigationAgent3D ведёт его к точкам патруля или игроку в обход препятствий, а две области Area3D отдельно замечают цель и определяют дистанцию атаки. Случайная длительность ожидания не даёт группе противников начать движение синхронно.Разбор 3D-врага в Godot 4 показывает структуру сцены и код состояний. Перед запуском нужно добавить в уровень
NavigationRegion3D и запечь навигационную сетку, иначе враг не сдвинется с места.Coding Quests
Godot 4 Enemy AI Tutorial: Patrol, Chase, and Attack
Build a complete 3D enemy AI system in Godot 4 with patrol waypoints, player detection, chase behavior, attacks, and hit reactions using state machines and NavigationAgent3D.
❤2
Как связать движение и направленные анимации в Godot 4
В 2D-персонаже мало умножить вектор ввода на скорость: после остановки он должен смотреть туда же, куда шёл, а при движении по диагонали выбирать подходящий спрайт. В Godot 4 это можно собрать через CharacterBody2D и AnimationTree без отдельных условий для каждого направления.
GDScript получает направление через Input.get_vector(), задаёт скорость для move_and_slide(), а анимациями управляют два BlendSpace2D внутри машины состояний. Один отвечает за покой, второй за ходьбу. Компоненты вектора округляются до −1, 0 или 1, а позиция смешивания обновляется только при ненулевом вводе. Поэтому после отпускания клавиш сохраняется последнее направление взгляда.
Практический разбор настройки показывает координаты для направленных анимаций и переключение между покоем и ходьбой через travel().
В 2D-персонаже мало умножить вектор ввода на скорость: после остановки он должен смотреть туда же, куда шёл, а при движении по диагонали выбирать подходящий спрайт. В Godot 4 это можно собрать через CharacterBody2D и AnimationTree без отдельных условий для каждого направления.
GDScript получает направление через Input.get_vector(), задаёт скорость для move_and_slide(), а анимациями управляют два BlendSpace2D внутри машины состояний. Один отвечает за покой, второй за ходьбу. Компоненты вектора округляются до −1, 0 или 1, а позиция смешивания обновляется только при ненулевом вводе. Поэтому после отпускания клавиш сохраняется последнее направление взгляда.
Практический разбор настройки показывает координаты для направленных анимаций и переключение между покоем и ходьбой через travel().
❤1
Как AMD уменьшает мерцание нейросетевого глобального освещения
Одношаговая диффузионная модель восстанавливает непрямой свет по данным о геометрии, материалах и освещении за один проход.
Для стабильности декодер получает предыдущий кадр, перепроецированный по векторам движения. Если текущее представление близко к истории, модель использует прежние пиксели и подавляет мерцание, сохраняя детали сцены.
Схема метода AMD показывает замену обычного декодера временным. На тестовых сценах подход лучше прежних методов сохранял геометрию и стабильность освещения. Замеров времени кадра и готовой интеграции в Unity, Unreal Engine или Godot пока нет.
Одношаговая диффузионная модель восстанавливает непрямой свет по данным о геометрии, материалах и освещении за один проход.
Для стабильности декодер получает предыдущий кадр, перепроецированный по векторам движения. Если текущее представление близко к истории, модель использует прежние пиксели и подавляет мерцание, сохраняя детали сцены.
Схема метода AMD показывает замену обычного декодера временным. На тестовых сценах подход лучше прежних методов сохранял геометрию и стабильность освещения. Замеров времени кадра и готовой интеграции в Unity, Unreal Engine или Godot пока нет.
❤1
Как озвучить пролетающие машины в Defold без десятков звуков
В вертикальном скроллере эффект Доплера можно имитировать без физической модели и обработки сигнала. До пролёта высоту тона держат чуть выше, после — ниже, а переход укладывают в узкую зону около точки пролёта.
Громкость считают по расстоянию с квадратичным затуханием, панораму — по горизонтальному смещению. Для боковой координаты берут локальную позицию объекта, чтобы тряска камеры не заставляла звук колебаться каждый кадр.
Микшер раз в кадр оставляет три источника: сначала видимые, затем ближайшие. В практическом разборе есть функции для высоты тона, громкости и панорамы, схема управления звуками и стартовые параметры, которые можно перенести в другой движок.
В вертикальном скроллере эффект Доплера можно имитировать без физической модели и обработки сигнала. До пролёта высоту тона держат чуть выше, после — ниже, а переход укладывают в узкую зону около точки пролёта.
Громкость считают по расстоянию с квадратичным затуханием, панораму — по горизонтальному смещению. Для боковой координаты берут локальную позицию объекта, чтобы тряска камеры не заставляла звук колебаться каждый кадр.
Микшер раз в кадр оставляет три источника: сначала видимые, затем ближайшие. В практическом разборе есть функции для высоты тона, громкости и панорамы, схема управления звуками и стартовые параметры, которые можно перенести в другой движок.
❤1
Как масштабировать Unity-проект: модули кода и проверки ассетов
После прототипа случайные связи между системами и крупные сцены мешают команде работать параллельно.
В разборе Mega Cat Studios Assembly Definitions группируют C#-код и явно задают зависимости. В Backyard Baseball ввод и игровая логика находятся в разных DLL, поэтому управление можно переписать без риска сломать физику персонажей или ИИ. Небольшие сцены и вложенные префабы снижают риск конфликтов между правками художников и дизайнеров.
AssetPostprocessor автоматически применяет правила импорта, а OnValidate сообщает об отсутствующих ссылках в редакторе до сборки. Для растущего Unity-проекта ориентир простой: после прототипа разделить код на модули, сцены на части и автоматизировать повторяемые проверки ассетов.
После прототипа случайные связи между системами и крупные сцены мешают команде работать параллельно.
В разборе Mega Cat Studios Assembly Definitions группируют C#-код и явно задают зависимости. В Backyard Baseball ввод и игровая логика находятся в разных DLL, поэтому управление можно переписать без риска сломать физику персонажей или ИИ. Небольшие сцены и вложенные префабы снижают риск конфликтов между правками художников и дизайнеров.
AssetPostprocessor автоматически применяет правила импорта, а OnValidate сообщает об отсутствующих ссылках в редакторе до сборки. Для растущего Unity-проекта ориентир простой: после прототипа разделить код на модули, сцены на части и автоматизировать повторяемые проверки ассетов.
Как Godot исправил просадки FPS от мышей на 8 кГц
Мышь с высокой частотой опроса может отправлять тысячи событий в секунду. В Windows поток сообщений способен перегрузить обработку ввода: до исправления быстрое движение мышью на 8 кГц почти останавливало тестовую сцену Godot.
Исправление вошло в Godot 4.7.2. События raw input читаются пакетами, а обычные сообщения движения мыши обрабатываются отдельно, не чаще одного раза за кадр. Клавиши, кнопки и колесо продолжают работать по прежней схеме.
Это полезный повод проверить обработчики
Разбор команды Godot
Мышь с высокой частотой опроса может отправлять тысячи событий в секунду. В Windows поток сообщений способен перегрузить обработку ввода: до исправления быстрое движение мышью на 8 кГц почти останавливало тестовую сцену Godot.
Исправление вошло в Godot 4.7.2. События raw input читаются пакетами, а обычные сообщения движения мыши обрабатываются отдельно, не чаще одного раза за кадр. Клавиши, кнопки и колесо продолжают работать по прежней схеме.
Это полезный повод проверить обработчики
_input() и _unhandled_input() в своём проекте. Дорогая логика на каждом движении мыши всё ещё может съедать время кадра, особенно при отключённом накоплении ввода.Разбор команды Godot
Godot Engine
Fixing high polling rate mice on Windows in Godot – Godot Engine
At long last, a performance issue with high polling rate mice on Windows has been fixed. This article describes how the fix works, and why it's so important today.
❤2
Как выбрать способ оптимизации шейдера в UE5
Граф Material Editor уже компилируется в HLSL. При этом Custom Expression может ограничить свёртку констант и дать больше инструкций, чем те же операции, собранные стандартными узлами.
Начать стоит с замеров:
Для обычного материала подходят узлы и Material Functions. Небольшую нестандартную формулу можно вынести в Custom Expression, а отдельный вычислительный проход — в Global Shader с RDG.
В разборе для UE5 показано, как выбирать уровень реализации и сравнивать результат на целевой платформе.
Граф Material Editor уже компилируется в HLSL. При этом Custom Expression может ограничить свёртку констант и дать больше инструкций, чем те же операции, собранные стандартными узлами.
Начать стоит с замеров:
stat unit помогает найти ограничивающий этап, а stat gpu и ProfileGPU — дорогие проходы. На стоимость материала влияют площадь экрана, перекрытие прозрачных объектов и обращения к текстурам.Для обычного материала подходят узлы и Material Functions. Небольшую нестандартную формулу можно вынести в Custom Expression, а отдельный вычислительный проход — в Global Shader с RDG.
В разборе для UE5 показано, как выбирать уровень реализации и сравнивать результат на целевой платформе.
DEV Community
UE5 Shader Optimization: Materials, Custom HLSL, and Global Shaders with RDG
When a material graph grows in Unreal Engine 5, it is tempting to ask: would writing HLSL directly...
Как убрать рывки движения других игроков
Допустим, сервер отправляет состояние мира десять раз в секунду. Если сразу переносить чужого персонажа в полученную позицию, он будет прыгать между точками каждые 100 мс.
Интерполяция использует два известных серверных состояния и плавно меняет положение между ними. Для этого клиент показывает других игроков с небольшой задержкой: в примере Габриэля Гамбетты она составляет 100 мс.
Получается, свой персонаж может реагировать на ввод сразу через клиентское предсказание, а остальные двигаются по уже полученным данным. Цена плавности — отображение их прошлого положения, что нужно учитывать при расчёте попаданий.
Разбор интерполяции с наглядными примерами помогает понять эту схему без привязки к конкретному движку.
Допустим, сервер отправляет состояние мира десять раз в секунду. Если сразу переносить чужого персонажа в полученную позицию, он будет прыгать между точками каждые 100 мс.
Интерполяция использует два известных серверных состояния и плавно меняет положение между ними. Для этого клиент показывает других игроков с небольшой задержкой: в примере Габриэля Гамбетты она составляет 100 мс.
Получается, свой персонаж может реагировать на ввод сразу через клиентское предсказание, а остальные двигаются по уже полученным данным. Цена плавности — отображение их прошлого положения, что нужно учитывать при расчёте попаданий.
Разбор интерполяции с наглядными примерами помогает понять эту схему без привязки к конкретному движку.
❤1
Как Godot ускорил анимацию Polygon2D
В тестовом проекте вершины Polygon2D анимировались через AnimationPlayer. Профилировщик показал, что движок каждый кадр пересоздавал внутренний меш: удалял старые массивы вершин, создавал новые и загружал данные заново.
Когда число вершин остаётся прежним, можно обновлять данные уже существующего меша. Команда Godot выделила подходящие случаи и использовала этот путь вместо постоянного пересоздания.
В демонстрационной сцене на Ryzen 5 9600X время кадра сократилось примерно с 35 до 13 мс. Результат относится к этому сценарию анимации.
Разбор с профилями до и после показывает весь ход поиска: от жалобы на медленную анимацию до конкретных затрат на создание и освобождение мешей.
В тестовом проекте вершины Polygon2D анимировались через AnimationPlayer. Профилировщик показал, что движок каждый кадр пересоздавал внутренний меш: удалял старые массивы вершин, создавал новые и загружал данные заново.
Когда число вершин остаётся прежним, можно обновлять данные уже существующего меша. Команда Godot выделила подходящие случаи и использовала этот путь вместо постоянного пересоздания.
В демонстрационной сцене на Ryzen 5 9600X время кадра сократилось примерно с 35 до 13 мс. Результат относится к этому сценарию анимации.
Разбор с профилями до и после показывает весь ход поиска: от жалобы на медленную анимацию до конкретных затрат на создание и освобождение мешей.
Godot Engine
Optimizing CPU-side Rendering Code – Godot Engine
Optimizing CPU code is a lot of fun. Here’s how we do it
❤1
Почему окрестности 5×5 недостаточно для ячейки Вороного
Один из способов строить процедурные регионы — взять квадратную сетку и случайно разместить по точке в каждой клетке. Чтобы вычислить полную ячейку Вороного, обычно строят диаграмму для локальной окрестности.
Борис из BorisTheBrave показал, что привычная область 5×5 может дать неверную границу: точка из клетки со смещением (3, 1) тоже способна на неё повлиять.
Автор определил набор из 36 соседних клеток, каждая из которых может оказаться значимой, и приложил формальное доказательство в Lean.
Это результат для вычисления полной ячейки. У поиска ближайшей точки для шума Worley свои требования к окрестности.
Контрпример и доказательство полезны для проверки генератора регионов или процедурной геометрии.
Один из способов строить процедурные регионы — взять квадратную сетку и случайно разместить по точке в каждой клетке. Чтобы вычислить полную ячейку Вороного, обычно строят диаграмму для локальной окрестности.
Борис из BorisTheBrave показал, что привычная область 5×5 может дать неверную границу: точка из клетки со смещением (3, 1) тоже способна на неё повлиять.
Автор определил набор из 36 соседних клеток, каждая из которых может оказаться значимой, и приложил формальное доказательство в Lean.
Это результат для вычисления полной ячейки. У поиска ближайшей точки для шума Worley свои требования к окрестности.
Контрпример и доказательство полезны для проверки генератора регионов или процедурной геометрии.
BorisTheBrave.Com
Minimal Neighborhoods for Evaluating Jittered Voronoi Grids
I’ve spoken several times about jittered Voronoi grids, such as here. These are infinite Voronoi diagrams where the sites come from randomly picking a point from each square in a square grid.…
❤1
Как ошибки QuadriFlow срывали ретопологию моделей SketchUp
Автор skpforge, инструмента подготовки ассетов для Unreal Engine 5, перенёс основной маршрут QuadriFlow на Rust. На моделях SketchUp обнаружились две ошибки исходной реализации: неверные связи полурёбер зацикливали обработку, а недостижимый код оставлял проблемные вершины неразделёнными.
После исправлений автор занялся максимальным потоком, который отнимал значительную часть времени ретопологии. На его данных алгоритм Бойкова — Колмогорова оказался удачнее Dinic.
На одной тяжёлой модели время обработки в Rust-порте сократилось с 441 до 137 секунд после замены решателя. Это измерение конкретного случая; сравнения с upstream в статье дают разные результаты в разных тестах.
Разбор ошибок, замеров и кода порта
Автор skpforge, инструмента подготовки ассетов для Unreal Engine 5, перенёс основной маршрут QuadriFlow на Rust. На моделях SketchUp обнаружились две ошибки исходной реализации: неверные связи полурёбер зацикливали обработку, а недостижимый код оставлял проблемные вершины неразделёнными.
После исправлений автор занялся максимальным потоком, который отнимал значительную часть времени ретопологии. На его данных алгоритм Бойкова — Колмогорова оказался удачнее Dinic.
На одной тяжёлой модели время обработки в Rust-порте сократилось с 441 до 137 секунд после замены решателя. Это измерение конкретного случая; сравнения с upstream в статье дают разные результаты в разных тестах.
Разбор ошибок, замеров и кода порта
DEV Community
Porting the QuadriFlow quad remesher to Rust: two upstream bugs and a max-flow surprise
A dependency-free Rust port of QuadriFlow for SketchUp to Unreal: two upstream bugs that hang it on T-junctions, and why Boykov-Kolmogorov beat Dinic.
❤1