Как стать автором
Обновить

Комментарии 12

тоесть костная анимация не так нагрузна? ведь ИК блендера даёт 100+ костей, на гпу допустим удастся вытащить из блендера 13 костей, итого на сцене может быть без запекания модельки и их может быть много что отразится на производительности (и ведь тут как раз делают обратную штуку вытаскивают кости запекают модельки и играют фреймы статичные) - получается скининг и кости это ключевой вопрос производительности (легко проверить кинув 10 моделек инстансингом с костями запустить их и кинуть главного персонажа и накинуть партиклов как дождик, и тут поидее будет всё видно), помимо этого еще лучи пускать ну к примеру о главного персонажа (ладно допустим лучи, а если расчеты обьемов делать, плюс еще какиенить дельта расчеты в пространстве понятно что всё упрощается ради производительности) (например поняв как из блендера вытаскивать своим форматом списки анимаций кейфреймами тогда как я понимаю в блендере вы делаете костную анимацию в движке будут просто 3д фреймы, просто недавно я смотрел 2 реализации 1 95 года вторая тоже но измененная - обе вытаскивают фреймы в движке не видел костей)

Гпу скиннинг быстрый но шейдеры не резиновые + циклы по костям и куча расчётов по влиянию той или иной кости на вертекс. И эти расчёты не батчатся на гпу нормально. В общем это все еще далеко не быстро и не дешево.

Если надо очень много дешевой анимации то есть техника VAT (Vertex animation texture), суть которой в записи позиции и нормали каждого фрейма в столбец текстуры, а по строкам уже раскидать разные фреймы анимации а далее 2 семпла текстуры в вертексном шейдере(для интерполяции) и передвижение вертекса в полученные данные. Естественно сильно большие меши потребуют огромных текстур что не очень хорошо, но десятки тысяч лоуполи человечков на трибунах будут работать с огромным фпс даже на смартфонах. Батчинг с такой техникой дружит очень хорошо, в юнити относительно дешево можно накинуть Material Property Block, и море вызовов из одной текстуры очень хорошо оптимизируется конвеером гпу.

интересно, спасибо посмотрю

Скрытый текст

вот видите тут кости как направляющие, а в движок пойдут только текстуры и кейфреймы + список анимаций и поидее там не будет костей, может оно реализовывается как вы говорите поидее тут измененный квака подход или доработанный, я вот хочу такой теме научится пока не пойму принцип ну так чуть чуть посматриваю (как раз 100+ костей)

Обычно костная анимация занимает ну максимум процентов 5 от времени рендеринга кадра. Но если персонажей десятки или сотни, то да, нужно оптимизировать

Не нашёл для себя эту статью интересной, хотелось бы получить полезные выводы и советы, применимые на практике, если это возможно, — ведь видеоигры, даже на одном движке, достаточно разнообразны. Автор разбирается в теме, буду следить за его новыми выпусками, желаю удачи :)

Да, согласен, я здесь специально не писал своих советов, это такой отстраненный обзор техник, даже в чем-то исторический.. Дальше будет интереснее, надеюсь :)

>Шейдер геометрии позволяет создавать дополнительные треугольники - например можно нарисовать что-нибудь на месте каждого вертекса исходной сетки. Часто используется для создания травы и весьма быстр, но работает по сути только на PC.

С 2013го уже работает на консолях, там dx10/dx11/dx12/Vulkan.

И с какого-то времени должен работать на ARM, там же Adreno совместим с dx11/dx12/аналогичными OpenGL решениями/Vulkan

Ну как бы где-то должен работать, но могут быть проблемы. Keijiro Takahashi, он разраб в Unity, писал что geometry shader is near-obsolete technology

А чем заменить их?

Ну официальные рекомендации предлагают использовать Compute Shaders. Ими можно в буфере вершин вместо одной вершины сделать несколько вершин, формирующих strip из треугольников. Либо можно использовать инстансинг, то есть в vertex-шейдер загнать буфер из вершин исходного меша и маленький буфер с мешем, которым мы будем рисовать по поверхности. В vertex-шейдере уже можно посчитать как исказить маленький меш, чтобы он был где нужно. Наверно такое описание не понятно, но это просто общий случай, слишком разные могут быть задачи - от рисования травинок на поверхности большого меша до рисования ребер. Да хоть извивающимися тентаклями можно всего персонажа покрыть)) Но, по моим тестам, по крайней мере на картах NVidia такой способ раза в 2 медленнее (при том же финальном количестве треугольников) чем шейдер геометрии

Да, еще есть Mesh и Task шейдеры, забыл про них написать в статье. Ими тоже можно было бы геометрию рисовать. Уже лет 7 как есть, но Unity их до сих пор не поддерживает

Решения на compute или на vertex медленнее в 2 раза по вашим наблюдениям, чем на геометрическом шейдере?

А вот это решение на vertex может работать и на очень старых GPU, даже тех где есть поддержка только dx8?

vertex точно медленнее, compute не помню, но вроде тоже. Там получается, что скорость зависит от количества вызова и вертексов и инстансов в DrawIndexedPrimitive(число_вершин_в_меше, число_инстансов_меша). Ну а геометрический шейдер "размножает" существующие вершины, числа в DrawIndexedPrimitive не увеличиваются

На DX8 инстансинга и чтения вершиннным шейдером структурных буферов нет. Это уж совсем старое железо, примерно 2001 год. Инстансинг это DX9 по крайней мере, структурные буферы DX10. Даже сейчас на мобилках, на Mali GPU не работают структурные буферы в OpenGL, в Vulkan правда работают

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории