ОК, так что давайте разделим это на части. Вы не указали, какую версию OpenGL вы хотите использовать - я предполагаю, что GL 3.3.
ВБО
Буферные объекты вершин, если рассматривать их как альтернативу клиентским вершинным массивам, в основном сохраняют пропускную способность графического процессора. Карта тайлов не очень много геометрии. Однако в последних версиях GL объекты буфера вершин - это only способ указания вершин (что имеет большой смысл), поэтому мы не можем говорить о «повышении производительности» здесь. Если вы имеете в виду "по сравнению с устаревшими методами спецификации вершин, такими как непосредственный режим или массивы на стороне клиента" , то да, вы получите повышение производительности, но вы, вероятно, почувствуете это только с 10k + вершинами на кадр Полагаю.
Текстурные атласы
Атласы текстур действительно хорошая возможность сэкономить на переключении текстур. Однако на GP3 с поддержкой GL3 (и DX10) вы можете сэкономить ОЧЕНЬ много проблем, характерных для этой техники, поскольку доступен более современный и удобный подход. Проверьте справочные документы GL на TEXTURE_2D_ARRAY
- вам понравится. Если вашей целью являются карты GL3, забудьте текстурные атласы. Если нет, имейте Google, какие старые карты поддерживают массивы текстур как расширение, я не знаком с деталями.
Предоставление
Так, как эффективно нарисовать карту тайлов? Давайте сосредоточимся на данных. Есть много плиток, и каждая плитка имеет следующую информацию:
- положение сетки (x, y)
- материал (назовем его «материал», а не «текстура», потому что, как вы сказали, изображение может быть анимированным и изменяться во времени; тогда «материал» будет интерпретироваться как «одна текстура или набор текстур, которые меняются во времени») или что угодно).
Это должны быть все данные «на плитку», которые нужно отправить в графический процессор. Вы хотите визуализировать каждую плитку в виде четырехугольной или треугольной полосы, поэтому у вас есть две альтернативы:
- отправлять 4 вершины (x, y), (x + w, y), (x + w, y + h), (x, y + h) вместо (x, y) на плитку,
- используйте геометрический шейдер для вычисления 4 точек вместе с координатами текстуры для каждой отправленной 1 точки.
Выберите свой любимый. Также обратите внимание, что это напрямую соответствует тому, что будет содержать ваш VBO - последнее решение уменьшит его в 4 раза.
Для материала вы можете передать его в виде символьного целого числа, а в своем фрагментном шейдере - основываясь на текущем времени (передаваемом как единая переменная) и идентификаторе материала для данной плитки - вы можете выбрать идентификатор текстуры из массив текстуры для использования. Таким образом, вы можете сделать простую анимацию текстуры.