Простой ответ - да, вы должны создать несколько буферов вершин, входные макеты, шейдеры и т. Д. И устанавливать соответствующие перед каждым соответствующим вызовом отрисовки.Это будет работать и достаточно эффективно (должно быть достаточно эффективно для 2D-игр на современном оборудовании).
В полноценном движке 3D-игр все становится немного сложнее.Обычно в движке рендеринга есть несколько дополнительных внутренних уровней абстракции, наслоенных поверх примитивных объектов, таких как буферы вершин и индексов, входные макеты, шейдеры и т. Д.
Довольно простой способ структурирования состоит в том, чтобы иметь класс Meshон знает обо всех буферах вершин, индексных буферах, входных макетах, шейдерах, текстурах и т. д., которые составляют часть трехмерной модели, которая может быть нарисована за один вызов отрисовки, и отвечает за их установку (часто вместе сдругие биты состояния рендеринга, такие как режимы наложения, режимы отбраковки и т. д.) и выдача соответствующего вызова отрисовки.
С изменением любого состояния устройства связаны затраты, и поэтому механизмы рендеринга часто разрабатываются для того, чтобы попытаться отсортировать всеобъекты, которые нужно рисовать в определенном кадре, чтобы минимизировать количество требуемых изменений состояния.Например, в рендере Dawn of War 2 мы сортировали всю геометрию сетки, чтобы мы могли рисовать, например, все шлемы космического корабля с минимальными изменениями состояния, прежде чем рисовать все тела космического корабля с различными вершинными и индексными буферами, текстурами,и т. д.
Современное 3D-оборудование и API имеют несколько меньшие издержки при изменении состояния, чем в прошлом, поэтому сортировка для минимизации изменений состояния менее важна, чем когда-то, но это все еще является обычной практикой для игр, которым необходимополучить максимальную производительность на ПК.
В механизме рендеринга данных, который поддерживает гибкую модель освещения и материалов, а также анимацию кожи, рельеф, системы частиц, полноэкранные эффекты, 2D пользовательский интерфейс и т. д., подходящий дизайн дляуправление всем состоянием, требуемым для рисования игровых объектов, и для его сортировки таким образом, чтобы его можно было нарисовать с максимальной эффективностью, может быть довольно сложным, и существует множество различных подходов к структурированию.Код для всего, что может быть классифицировано как «управление состоянием визуализации», часто составляет значительную часть кода в типичном механизме рендеринга.