Подводные камни перемещения объектов используя атрибуты вместо матрицы трансформации
Какой вариант практичнее? Перезапись буфера атрибутов или же перемещение с помощью матрицы трансформации?
Третью недель вникаю в WebGL и пытаюсь сделать маленькую 2D игру для развития. Пришла пора добавить персонажам вращение и поэтому сразу решил сделать это с помощью матриц. Я раньше не задумывался, но с помощью матриц можно делать и обычное перемещение объектов.Перемещение у меня сделано на перезаписи буфера атрибутов.
Если вспомнить, в некоторых шутерах, в начале игры все персонажи стоят на одной точке, а потом их немного раскидывает по разным местам. Мне кажется, это про мой случай, игроков, изначально, инициализировали с помощью атрибута в одно место, а потом матрицей распределили по своим местам.
Ответы (1 шт):
Классический и правильный метод - перемещение с помощью матрицы трансформации.
Преобразование атрибутов (положения) руками, это очень неэффективный метод (вы перезаписываете буфер каждый раз). Да, вам может казаться, что проще руками все вершины подвинуть на +X +Y вместо сложного матричного умножения, однако вы это делаете на CPU и загружаете новый буфер на GPU каждый раз, в то время как ваш GPU мог бы заниматься полезным делом - рисовать. В то же время, трансформация положения тысяч и даже миллионов вершин на GPU дается практически даром (при современных мощностях видеокарт).
Это также неэффективно с точки зрения ООП. У вас должен быть объект (персонаж) и его положение (на уровне). Это две разных сущности и не стоит их сливать в одну "персонаж в положении".
Также, если у вас будет несколько одинаковых персонажей, то вы сможете рисовать их из одного буфера, просто передавая разные матрицы трансформации, вместо того чтобы для каждого заводить по уникальному буферу.
Модификация атрибутов (т.е. изменение геометрии самой модели) может иметь смысл для визуализации расчетов с CPU (например, если у вас был бы редактор 3Д моделей или физика).
Если вспомнить, в некоторых шутерах, в начале игры все персонажи стоят на одной точке, а потом их немного раскидывает по разным местам
Это к делу никак не относится, т.к. это просто организация загрузки уровня, когда конструктор создает объекты отдельно от их расстановщика по местам.