Использование объектов Vertex Buffer для игры на основе плиток и текстурных атласов - PullRequest
3 голосов
/ 07 декабря 2010

Я создаю игру на основе плиток в C # с OpenGL и пытаюсь оптимизировать свой код как можно лучше.

Я прочитал несколько статей и разделов в книгах и все пришли к одному и тому же выводу (как вы, возможно, знаете), что использование VBO значительно повышает производительность.

Однако я не совсем уверен, как именно они работают.

Моя игра будет иметь плитки на экране, некоторые изменится, а некоторые останутся прежними. Чтобы использовать VBO для этого, мне нужно было бы добавить координаты каждой плитки в массив, правильно?

Кроме того, чтобы текстурировать эти плитки, я должен был бы создать отдельный VBO для этого?

Я не совсем уверен, как будет выглядеть код для разбиения на эти координаты, если у меня есть анимированные плитки и плитки, которые будут статичными на экране. Может ли кто-нибудь дать мне краткое изложение этого?

Я планирую использовать текстурный атлас всех моих плиток. Я не уверен, где начать использовать этот атлас для текстурированных плиток. Нужно ли мне вычислять координаты плитки в атласе, который будет применен? Можно ли как-то просто использовать координаты атласа для наложения текстуры?

Если бы кто-нибудь мог прояснить эти вопросы, это было бы очень признательно. Я мог бы даже возместить кому-то время и помощь, если бы захотел.

Спасибо

Грег

1 Ответ

7 голосов
/ 08 декабря 2010

ОК, так что давайте разделим это на части. Вы не указали, какую версию 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 раза.

Для материала вы можете передать его в виде символьного целого числа, а в своем фрагментном шейдере - основываясь на текущем времени (передаваемом как единая переменная) и идентификаторе материала для данной плитки - вы можете выбрать идентификатор текстуры из массив текстуры для использования. Таким образом, вы можете сделать простую анимацию текстуры.

...