При всех моих ухищрениях персонаж создаётся 33 секунды. И это много. Очень много. Хотя мне пришла в голову идея, как сократить это число раза в 4. Но всё равно много для моих целей.
На днях один человек подсказал мне другой подход. Который используют в Sims4.
Вместо блендшейпов использовать карты смещения.
Вкратце так, для каждого блендшейпа мы генерируем текстуру, куда заносим разницу между координатами основной базисной фигуры и конкретного шейпа (то есть максимально толстый персонаж). И так для каждой формы. Потом мы миксуем эти картинки и получаем итоговую картинку с применёнными изменениями. И уже из цветов этой картинки прибавляем к базовому мешу.
В чём прелесть такого подхода?
1. Насколько я понимаю, картинки можно микшировать (да, именно стандартное mix в опенгл является линейной интерполяцией, которую я использовал для каждой вершины и которая так тормозит) с помощью шейдера. А он может смикшировать картинки довольно быстро. Я на это надеюсь. Конечно, с шейдерами я работать не умею, да. Но это ещё впереди)) А дальше уже применение самой картинки к базовому мешу. Это я делаю за 0.2 секунды и есть потенциал повысить скорость раза в 4.
2. Эти же карты смещений вполне себе можно использовать для другого меша, если их развёртка совпадает. То есть, юзать лоу-поли топологии из того же мейкхумана. И можно будет реализовать LOD хотя бы.
В чём недостаток такого подхода? В неточности. Цвет в годот является флоатом в диапазоне от 0 до 1. И мы должны запихнуть координаты вершин (которые могут быть в любом диапазоне) между 0 и 1. А потом восстановить их из этого диапазона. И при этом реально теряется довольно внушительная часть информации. Речь идёи о 5% ошибке, может даже больше. Кроме того, наложение меша на текстуру UV не совсем точное. Не до пикселя. А нам нужно очень точно взять цвет. Но мы берём цвет соседнего пикселя.
Что, кстати, сыграло со мной злую шутку. У меня долго меш выдавал непонятную фигню. Вот на картинке кубик, который я построил из текстуры на том же скрине.
Ну, угадать можно, но это ж не кубик)) Потому что развёртка по краям берёт серый цвет, вместо цветного. Потому что не точно пиксель в пиксель накладывается. И иногда берёт серый цвет вокруг. Тут со мной злую шутку сыграл годот, где по умолчанию цвет фона серый. И я далеко не сразу увидел, что это за фигню я получаю и не должен ли я это получить. Потом уже, когда я нашёл, откуда ноги растут, я сменил фон на чёрный, чтобы нули явно выбивались из списка вершин, которые я распечатывал в надежде отловить баг. Серый же цвет выглядит вполне осмысленными координатами и теряется.
Проблема решилась банальным масштабированием. Но это тоже снизило точность, теперь берутся соседние пиксели (да и раньше не угадывалось точно, иначе бы не было глюков с серым цветом), сильно это не влияет, так как цвета по полигону интерполируются между вершинами и мы получаем "примерно" то, что надо.
Насколько примерно? Ну вот результат сохранения меша в текстуру смещения и восстановления из него. Слева оригинал, справа восстановленный.
И да, из-за ошибок есть даже дыры в сетке (на ногах) там просто вершины полигонов отходят друг от друга.
Почему я продолжу изучать эту тему, несмотря на неудовлетворительный результат восстановления?
Потому что здесь я запекал напрямую координаты. А я хочу попробовать запечь не координаты, а разницу между ними. Это сузит диапазон. И, возможно, такой большой разницы не будет. Ещё есть что покопать, прежде чем сдаваться.
Нефть + 15%, детка!
September 16 2019, 18:00:49 UTC today
September 16 2019, 18:29:55 UTC today
September 16 2019, 20:12:47 UTC today
September 17 2019, 04:48:36 UTC today Edited: September 17 2019, 04:50:09 UTC
Смысл в том, чтобы иметь одну модель персонажа, но применить разные смещения и они были разными. Так работает Симс-4. Так персонажей дохера, все разные, все редактируются, но модель одна.
September 17 2019, 02:33:29 UTC today Edited: September 17 2019, 02:35:04 UTC
проект находится на стадии развертывания, а ты говорил обанкротятся