Я использую цикл рендеринга следующим образом:
- Потерять данные и сопоставить буфер.
- Запишите команду и запишите сгенерированную вершину в буфер.
- Отменить сопоставление буфера.
- Перебирайте команды, которые могут изменять состояния, связывать текстуры или рисовать.
На данный момент я использую формат с одним чередованием вершин (SoA), который имеет все атрибуты, которые может использовать любой из моих шейдеров.
struct OneSizeFitAllVertex
{
float pos[3];
float uv0[2];
float uv1[2];
float col[4];
};
При использовании более простого шейдера, который использует, например, только положение и цвет, я бы записал только тот атрибут, который мне нужен, в отображаемой памяти, а код шейдера просто проигнорировал бы все неиспользуемые атрибуты.
Поскольку это кажется расточительным, я рассматриваю возможность использования разных форматов вершин для каждого из моих шейдеров.
Простые объекты, отображаемые с помощью простого шейдера, будут использовать SimpleVertex:
struct SimpleVertex
{
float pos[3];
float col[4];
};
В то время как другие, мультитекстурированные объекты, будут отображаться с использованием мультитекстурного шейдера и использования MultitextureVertex:
struct MultitextureVertex
{
float pos[3];
float uv0[2];
float uv1[2];
};
Как мне обрабатывать эти разные форматы?
Должен ли я записать все вершины разного формата в один и тот же сопоставленный буфер и изменить свои AttribPointers перед рисованием? Это сэкономит немного места.
Должен ли я отображать разные буферы для каждого формата вершин? Возможно, более эффективным.
Или я должен сохранить универсальный формат вершин? Это проще.
Мне любопытно узнать, что является лучшей практикой в этой ситуации. Спасибо.