tgindex

Математика в Gamedev по-простому

описание

Как на самом деле работают стрельба, толпа NPC, графика, физика тканей и свет в играх. Разборы на пальцах, рабочий код, интерактивы. dev-math.ru Сотрудничество: @it_bizdev

521
подписчиков
Охват к подписчикам
76,4%
ERR
Реакции к просмотрам
1,75%
426 на 49 постов
Пересылки к просмотрам
0,63%
154
Постов в день
1,1
всего 84

Где отзываются чаще

доля реакций к просмотрам
  • 13 авг.На всякий случай завел Макс https://max.ru/channel_dev_math Раз уж там можно сделать публичный канал, а не приватный. Там будет всё тоже самое, только работает без VPN. Мало ли кому-то удобнее. P.S. Негатив в тг мне понятен :) Но занимать имена надо :) И не призываю никого подписываться :) Кому удобнее так — можете) А так мне все равно, это будет просто копия тг, без «подпишитесь, там уникальный контент». #новости #devmath9,59%
  • 6 июл.без подписи6,78%
  • 7 июл.без подписи6,61%
  • 31 июл.Статья немного задерживается, так как автор в ловушке6,09%
  • 17 авг.Тень — это фотография мира из лампы Присядьте так, чтобы ваш глаз оказался там, где лампочка, и посмотрите оттуда на комнату. Что видно с этой точки — туда свет лампы дошёл напрямую, чего не видно — не дошёл. Дальше уже дело отскоков (и это больше к теме GI): скажем белая стена подсветит и то, что от лампы закрыто. Но форму самой тени задаёт именно этот вид: она повторяет силуэт, каким предмет виден лампе, а не вам. Собственно, ровно это делает игра. Рисует кадр со стороны света и сохраняет не цвет, а глубину: как далеко ближайшая поверхность в каждом направлении. Потом, рисуя картинку уже вам, для каждой точки смотрит в этот снимок. Приём предложил Лэнс Уильямс в 1978-м, и в реальном времени тени до сих пор чаще всего считают именно так. Снимок конечного размера: сколько в нём пикселей, столько записано чисел, и покрывает он конечный кусок мира — между числами данных нет. Зубцы по контуру, рябь на ровном полу, тень, обрывающаяся по невидимой линии вдали — последствия этого. Почему конечный размер даёт именно такие артефакты — разберём в пятницу. #геймдев #графика #математика #рендер #тени #gamedev5,19%
  • 5 авг.Ребята... Мне нужна ваша помощь https://dev-math.ru/support/ Сегодня наверное будет самое сложное для меня. Всегда хочется казаться крутым и что всё получается. Но пора смириться с тем, что рынок на котором я работал последние 7 лет мертв. И с одной стороны это грустно, так как было убито столько времени и сил в развитие своего дела. А с другой это новая возможность. Всем привет. Меня зовут Гриша Дядиченко. Ну про мой карьерный путь вы возможно читали. И вот начинается новая глава. Возможно знаете меня лично. Может мы вместе тусовались на конференциях. Возможно вы были когда-то на моих митапах в Москве. Возможно вы читали мои статьи, посты, пользовались репозиториями. А может мы вместе когда-то работали. И сейчас мне нужна ваша помощь. Я хочу сделать интересную игру. Но думаю моих оставшихся ресурсов не хватит. Эта игра - ностальгическое путешествие по легендарным историям из разработки. По механике это головоломка вдохновлённая инкредибл машинс и другими старыми головоломками. Хочется сделать что-то действительно крутое и интересное. На рынке, где сейчас не всё так просто, особенно с тем какие палки в колеса на нём вставляются всем. Собственно моя просьба. Если вы верите, что я способен сделать что-то интересное. То поделитесь этим постом или ссылкой, если не трудно. Возможно у вас есть какой-то свой блог, знакомые с блогами, чат (только если в чате разрешено такое публиковать, спамить не надо). А если такой проект вам интересен или есть желание просто поддержать мою инициативу, за все статьи что я написал и репозитории что я сделал, да или просто подкинуть монет на мечту старому знакомому, то вообще супер. Хотелось бы как раньше иметь возможность на покупку рекламы в блогах или вроде того. Но сейчас ресурсы исчерпаны. Я всё равно сделаю игру. Просто с поддержкой она может получиться круче, о ней узнает больше людей, и думаю тогда получится сделать что-то действительно крутое. Инфоцыганином мне пока всё ещё не позволяет стать совесть. Так что буду делать игру. В общем для вас это может быть мелочью или парой кликов, а мне вы очень поможете и я буду признателен.4,46%
  • 14 авг.Куда уходит свет, который поверхность не отразила https://dev-math.ru/articles/pbr/ Физика отражения в реальном времени: BRDF и уравнение отражения, микрофасеты и распределение GGX, Френель и F0, затенение по Смиту и знаменатель 4(N·L)(N·V), white furnace test как проверка энергии, metallic/roughness workflow. В общем если вы хотели узнать, что за параметры metallic и roughness. Почему металлик в теории на самом деле бинарный и прочие нюансы PBR рендера — статья для вас. Репосты и 🔥как всегда приветствуются. Это помогает развиваться каналу, а значит выпускать новые материалы. А на следующей неделе уже будем разбирать тени и шадоумаппинг. #devmath #статья #pbr #рендер3,40%
  • 15 июл.Почему далекие поверхности мерцают? Проблема: две далёкие поверхности — стена и налепленный на неё декаль, земля и дорога — начинают дрожать и «драться за пиксель», стоит чуть двинуть камеру. Первое желание — лезть в материалы, сортировку, освещение. А чинится это обычно в настройках камеры. Виновник — ближняя плоскость near, выставленная слишком близко к нулю. Классика: near = 0.01, чтобы близкое не обрезалось, и far = 1000, чтобы видно было далеко. Выглядит безобидно. Но точность буфера глубины распределена не поровну. При near = 0.01 и far = 1000 у дальней плоскости соседние значения глубины (в типичном 24-битном буфере) ошибаются почти на 6 единиц — всё, что ближе ~6 единиц друг к другу, буфер там уже не различает. Отсюда мерцание. И вот что неочевидно: далёкую точность рушит именно ближняя плоскость. Сдвиньте near с 0.01 до 1 при том же far — и различимость глубины вдали улучшится примерно в сто раз. Даже 0.01 → 0.1 даёт ×10. Решает не разность far − near, а их отношение far/near: чем оно больше, тем хуже вдали, а главный рычаг — не тянуть near к нулю. Практический вывод, который снимает целый класс мерцания: держите near настолько далеко, насколько терпит сцена, а far — настолько близко, насколько можно. Чем у́же диапазон, тем чище глубина. Прежде чем крутить материалы — проверьте эти два числа. А почему точность вообще нелинейна — это прямое следствие проекции и деления на w. Разберём в пятницу: в статье будет интерактив, где видно кривую глубины и что с ней делает ползунок near. #геймдев #графика #математика #zfighting #рендер #камера3,27%
  • 8 июл.Обернул шейдер в if, чтобы считать реже. А быстрее не стало Вы нашли в шейдере тяжёлый кусок — дорогой цикл, лишний проход, ветку с кучей математики — и обернули его в if: мол, для половины пикселей эту дорогую ветку пропустим и сэкономим. Пропустили. А кадр не разгрузился ни на сколько. Видеокарта прячет задержку памяти тем, что держит не один поток, а тысячи. Один встал на выборке из памяти — планировщик тут же пускает считать другой, у которого данные уже приехали; пока первый ждёт свою порцию, вычислители заняты чужой работой. Вот зачем на GPU тысячи потоков. Мало потоков— прятать нечем, и тогда видеокарта реально встаёт на сотни тактов ожидания. Но тут и зарыта плата. Одно ядро GPU — это не маленький процессор, а простая и небыстрая линия: ни хитрого предсказания ветвлений, ни глубоких кэшей, один поток на нём медленнее, чем на CPU. Сила — в количестве. И эти линии не независимы: они идут строем, группами (у NVIDIA — по 32), и вся группа исполняет одну и ту же инструкцию разом, каждая над своими данными. Это SIMT — одна команда, много потоков. Представьте не тысячу гонцов, у каждого свой маршрут, а колонну, марширующую в ногу: шаг у всех общий. Собственно, вот и разгадка вашего if. У этого есть имя — дивергенция ветвлений (branch divergence, ещё говорят «расхождение варпа»). Когда потоки одной группы на развилке расходятся, железу приходится прогнать обе ветки по очереди, отключая на каждой те линии, которых там нет. Группа идёт так же долго, как все пути её потоков вместе взятые. Ваш «пропустить дорогой код» экономит, только если его пропускает вся колонна разом. Один поток свернул в тяжёлую ветку — и остальные тридцать один стоят и ждут его. По сути, ветвления тут не под запретом — платите вы не за if, а за расхождение внутри группы. Противоположность расхождения — когерентность: это когда соседние потоки заняты одним и тем же, все сворачивают в одну сторону и шагают в ногу. Такая когерентная ветка почти бесплатна — вторая сторона просто не исполняется. Пример. Материал с enum-режимом и switch (_Mode) в шейдере (классический ubershader, куда свалили все варианты освещения). Если режим один на весь материал — uniform-параметр, — весь варп читает одно значение и идёт одной веткой, остальные просто не исполняются: расхождения нет, дёшево. Но стоит выбирать режим попиксельно — из маски материалов, material-ID в G-буфере, слоёв терреина — и соседние пиксели одного варпа уходят в разные ветки: на стыках материалов варп прогоняет все режимы по очереди. И та же боль в raymarching и SDF: часть лучей упирается в поверхность за пару шагов, часть марширует до предела — и вся группа топчется в цикле, пока не закончит самый глубокий луч. Ранний выход по одному лучу ничего не даёт: время группы держит самый медленный поток. В четверг — почему переключение шейдера или материала сбивает весь этот разгон: смена стейта и флаш конвейера, и чем тут спасают батчинг с инстансингом. #devmath #графика #математика #gpu #simt #оптимизация3,20%
  • 26 июн.без подписи3,13%
  • 22 июл.Поговорим про Overdraw Сложная сцена проседает по fps. Первым делом вы идёте резать полигоны: упрощаете меши, расставляете LOD'ы, чистите вершины. Треугольников стало заметно меньше — а кадр не полегчал. Профайлер показывает, что видеокарта всё время сидит в пиксельном шейдере, а не в геометрии. Дело в том, что один пиксель за кадр закрашивается не по разу. Поставьте три объекта друг за другом по глубине: дальше всех стена, перед ней ящик, перед ящиком стойка. Рисуются они в том порядке, в каком их отдал движок, — и если дальняя стена попадёт под кисть первой, она закрасит свои пиксели и целиком отработает шейдер: текстуры, свет, туман. Потом поверх ляжет ящик — и тоже целиком. Потом стойка. На экране виден только ближний слой, а пиксельный шейдер отработал по числу слоёв. Это и есть overdraw — работа, оплаченная за пиксели, которые в итоге никто не увидит. Плотный интерьер, свалка пропов, наслоённые полупрозрачные эффекты — там overdraw набегает быстро. Горит fillrate. Fillrate (филлрейт) — это скорость, с которой видеокарта заливает пиксели в буфер кадра: её пропускная способность на закраску, отдельная от пропускной способности на геометрию. Поймать довольно просто. Подведите камеру вплотную к скоплению объектов: если fps проседает там, где в кадр влезает даже меньше геометрии, но она плотно перекрывается по глубине, — вы уперлись в overdraw, а не в треугольники. А ещё лучше — включите режим overdraw: он есть у Unity, Unreal и мобильных профайлеров. Места, перекрашенные много раз, светятся всё ярче. Это буквально ваш счёт за кадр, нарисованный поверх сцены, — один раз увидев его, вы перестаёте гоняться за полигонами. Видеокарта умеет выбрасывать перекрытые пиксели ещё ДО того, как посчитает их шейдер. Но у этого механизма есть условие, и когда объекты рисуются «как легли в сцене», условие не выполняется — и каждый невидимый слой всё равно оплачен. Что это за условие и что делать, когда шейдеры настолько дорогие, что и сортировка не спасает, — разберём в пятницу. #devmath #графика #математика #рендер #оптимизация #gamedev2,78%
  • 15 авг.Теперь в модном чёрном цвете https://dev-math.ru/ Вы попросили — я сделал. Мне не сложно. Так же как запрашивать какие-то темы (но новое я что-то буду делать когда добью свой "учебник по рендеру", а это ещё 3 статьи) — можно запрашивать какие-то фичи, если вам что-то не нравится и неудобно. По навигации или типа того. А так на сайте теперь работает тёмная тема. Смотрю пока что никакой раздел не поехал, если обноружите какие-то баги — пишите. Я и сам ищу. А так согласен, ну какой сайт про разработку и для разработчиков без тёмной темы? #новости #devmath2,70%