Всеволод's banner
Всеволод's profile picture

Всеволод

@vseplet • 1,973 subscribers

Инженер, нигилист, НЕ программист, пишу https://t.co/JAWa3rEAyR, автоматизирую все и вся, а голос вообще пушка

Videos

vseplet's profile picture

Мне удалось нащупать сочетание разных методов бросания лучей, которое рисует в реальном времени воксели, объемные гауссианы и сложные гладкие поверхности (SDF) — все сразу, в одном кадре, с отражениями, преломлениями и освещением Программирую я с десяти лет, и любимой темой всегда была и остается компьютерная графика, особенно та часть, что связана с играми. В игровой индустрии я отработал какое-то небольшое кол-во лет и может быть чуть-чуть разбираюсь в разработке игр Последнюю неделю я обдумывал сценарий видео для ютуба об истории трассировки лучей и о том, как работают рейкастинг, реймарчинг, рейтрейсинг и прочее. Надо было освежить знания и попрактиковаться, но меня, как обычно, унесло в дебри и детали реализации Скорее всего, я не открыл Америку. Но картинка получается непривычная: объемный дым, который отбрасывает тень и сам освещается, лиминальные пространства, фракталы, довольно странные существа Самое интересное вылезло дальше. Когда весь мир обсчитывается лучами и полем расстояний, те же механизмы закрывают не только картинку. По полю считаются столкновения и направления сил, отдельного кода физики почти не понадобилось. Со звуком то же самое: лучи от источника обходят сцену так же, как световые, и дают отражения, задержки и поглощение по материалам Да, в упрощенном виде, но такого нет в подавляющем большинстве игр. Тот факт, что один механизм закрыл сразу три составляющие виртуального мира, поразил меня. В итоге простой рендер за несколько вечеров разросся до небольшого движка, пусть и демонстрационного Теперь мне важно понять, есть ли интерес к теме. Это не самый быстрый подход и не такой универсальный, как классические полигоны с аппаратной растеризацией, но что-то в этом есть) Кароче, сделай ретвит, поставь лукерк и оставь комментарий. Если этот пост соберет много внимания — я скорее всего займусь разработкой полноценного демо какой-нибудь сурвайвл песочницы на данной технологии

Всеволод

162,806 просмотров • 1 месяц назад

vseplet's profile picture

Я поставил себе условие: если пост про трассировку лучей привлечёт кучу внимания — я займусь разработкой какой-нибудь игры на базе этой технологии Он взял, и собрал больше трех тысяч лайков, принес более 400 подписчиков и просто был добавлен в закладки более тысячи раз! Огромное вам спасибо, разработке игры быть В прошлом посте я рассказывал о гибриде разных методов бросания лучей для отрисовки в один проход вокселей, SDF, гауссин и так далее В этом посте я коротко поясню о том, как это работает (в приложенном видео анимация работы алгоритма) + дам необходимые ссылки ниже 1. Видимый мир В видео на демо все, что мы рисуем, состоит из двух вещей: воксели и sdf (гладкие формы, шары, скругленные тела и не только). Мир гибридный — кубики и гладкие фигуры живут вместе в одной сетке. И на первом шаге мы строим эту сетку, определяя в какой клетке какие воксели или фигуры находятся. Важно заметить, что одна фигура может занимать несколько клеток, а несколько фигур могут занять одну клетку 2. Пирамида Чтобы не проверять каждую клетку по отдельности (их миллионы), мы строим над сеткой пирамиду. Делим мир на более крупные ячейки и для каждой запоминаем всего одно: есть внутри хоть что-нибудь или там пусто. Потом объединяем ячейки по четыре в более крупные, и так уровень за уровнем. Получается "карта заполненности", где пустые области отваливаются целыми кусками, а в заполненных ячейках могут содержаться воксели и/или фигуры 3. Лучи Теперь пускаем луч. Луч идет по пирамиде сверху вниз: попал в крупную пустую ячейку — перепрыгнул ее целиком одним шагом, не тратя время. Попал в заполненную — спускаемся на уровень мельче и смотрим внимательнее. Дошли до вокселей — включаем ray casting. Дошли до гладкой фигуры — включаем ray marching, пока не приблизимся на минимальную необходимую дистанцию или пролетим мимо. Так луч быстро проскакивает пустоту и быстро находит воксель или фигуру, в которую вероятнее всего упрется Помимо вокселей и sdf сюда же могут идти отдельные модели с собственной воксельной сеткой, объемные гауссины, частицы и что душе угодно. В каждом отдельном случае используется необходимый способ бросания луча или комбинация несколькльких В демо на видео мне удалось в 60fps отрисовывать 1 073 741 824 цветных вокселя и около 100 простых sdf без использования GPU на обычном canvas 2d context (javascript) Дальше я буду рассказывать и показывать демо возможной игры, так что ставь лайк, ретвить и подписывайся — мне это очень важно!

Всеволод

35,438 просмотров • 1 месяц назад

vseplet's profile picture

Я получил феноменальный результат. Для своего кастомного игрового движка мне удалось разработать прототип сетевого кода, который тянет синхронизацию мира в миллиард вокселей на 100+ одновременных игроков, если хостом является обычная вкладка браузера или 250+ на нативном хосте (rust + webgpu/metal) Подчеркиваю, речь идет о полной разрушаемости миллиарда вокселей, перемещениях, выстрелах, полном обсчете видимости между всеми игроками (каждый из них получает информацию только о тех игроках, которых может видеть) и коллизиях Как мне удалось добиться такого фантастического результата? Я просто перенес обсчет состояния мира полностью на вычислительные шейдера, то есть на GPU. Итого, отрисовка одного кадра занимает примерно 0.5 мс (74к лучей), а обсчет состояния мира 8-10 мс в хроме на m5 Изначально я строил рендер на лучах, физику на лучах, обсчет звуков на лучах, а теперь и сетевой код использует рассчитываемое на GPU состояние мира Это абсолютная победа, хоть и в условиях интернета все будет гораздо сложнее

Всеволод

13,135 просмотров • 26 дней назад

Больше нет контента для загрузки