Привет.
Пытаюсь понять как правильно рендерить биллборды импосторов.
Для случая, когда камера смотрит с разных углов, определяются UV в атласе и выбирается наиболее подходящий тайл - это работает.
Но если модель наклонить, то увы - просто ориентировать квады по направлению взгляда недостаточно.
Повороты по двум осям решаются через атлас, но нужно еще учитывать поворот относительно оси взгляда.
Атлас вот такой:
Аналогичная проблема возникает из-за перспективной проекции, когда объект находится с края экрана:
UV рассчитываются следующим образом: берем вектор направления на камеру, применяем к нему трансформ самой модели (чтобы учесть повороты самой модели) и считаем 2 угла. Один через atan2(dir.z, dir.x) - этот угол определяет тайл с поворотами относительно вертикальной оси. Второй через asin(saturate(dir.y)) - он определяет поворот относительно горизонтальной оси. Из обоих углов формируем UV (0..1).
Очевидно, эта задача давно решена - не хочется изобретать свой велосипед с квадратными колесами. Как это делать правильно?
С перспективой все просто - view aligned billboard в этом случае (очевидно же!) не канает. Нужно выравнивать квад в world space по направлению к камере.
Теперь буду думать над вращением по Z.
Похоже, что нужно разложить modelview матрицу на эйлеровы углы, два из них будут задавать тайл атласа, а третий будет описывать вращение биллборда относительно оси view 🤔
А еще центр координат модели не обязательно совпадает с центром импостора, бррр.
А что, если биллбоард позиционировать ровно под тем углом, под которым он был пререндерен? Тогда всё должно как надо работать.
San
> С перспективой все просто
Если у тебя перспективные искажения влияют, то очевидно, что ты биллбоард слишком близко рисуешь. Там, где перспектива заметна, нужно уже полноценную модель рисовать.
В общем, как-то запилил, но результат так себе.
Возможно, имеет смысл попробовать вместо билборда несколько квадов крест-накрест - так и позиционирование будет точным, без дискретизации, и тени будут работать корректно. И, как бонус, тайлов в атласе будет меньше, что повысит их разрешение.
Panzerschrek[CN]
> биллбоард позиционировать ровно под тем углом, под которым он был пререндерен
В этом и заключается задача - корректно рассчитать ориентацию.
> Если у тебя перспективные искажения влияют, то очевидно, что ты биллбоард слишком близко рисуешь
Там у меня криво сформулировано. В любом случае, с этим моментом все уже ясно.
https://shaderbits.com/blog/octahedral-impostors
видео в статье чтобы открыть надо открывать отдельно скопировав url
https://youtu.be/JOL5e-J1btA
Salamandr
Это я читал. Интересно, но там основная идея - в оптимальном расположении камеры при запекании. Детали рендеринга самого билборда не особо затрагиваются. В частности, с учетом трансформа модели, а именно это и интересует.
В целом у меня все работает, но есть косяки.