OpenGL VBO / DisplayList в игровой среде - PullRequest
1 голос
/ 04 ноября 2011

Я работаю над небольшой игрой (использую OS X Lion, Xcode 4, Objective-C / C ++, Cocoa, OpenGL).Это довольно простая концепция.У меня есть несколько объектов, которые перемещаются внутри двумерного массива.Теперь я хочу написать графический интерфейс OpenGL для моей игры.

Я прошел через мой массив и нарисовал куб для каждого объекта внутри него, в своей конкретной позиции, с текстурой, которая зависит от видаобъект.Конечно, моя первая наивная реализация была немного загружена процессором, поэтому следующим шагом было внедрение текстурного атласа.Поскольку у меня много вершин, есть еще много возможностей для улучшения.

Я читал, что VBO и DisplayLists намного быстрее.Я работал над некоторыми учебными пособиями, но у меня все еще есть много вопросов о реализации в реальной динамичной игровой среде.

Скажем, я скомпилировал несколько списков отображения для моих игровых объектов.Если я хочу поместить его в определенную позицию, я бы использовал glTranslatef ().Но многие функции glTranslatef () могут сильно загружать процессор.Как мне справиться с этим?Конечно, я мог бы создать список отображения для каждого типа игрового объекта в каждой возможной позиции, но это кажется непрактичным, и это будет работать только потому, что моя игра основана на тайлах ...

VBOs, похоже, страдаютиз той же проблемы.Конечно (по крайней мере из моего понимания) я мог бы создать целую сетку вершин, затем пройти через мой массив и для каждого объекта визуализировать куб вершин, связанный с положением объектов.Но я не понимаю, как применить текстуру к конкретному кубу из целой сетки вершин.Нужно ли создавать текстурные координаты для каждой грани куба внутри сетки или будет достаточно для создания текстурной координаты для всех 6 граней куба?

1 Ответ

1 голос
/ 05 ноября 2011

Отображение списков и VBO обычно не помогает с тривиальной геометрией.Иногда они могут даже замедлить его, если я правильно помню из синей книги OpenGL.

Списки отображения были «так же хороши, как и они» в OpenGL 1.x, но считались устаревшей функциональностью с введением VBO.

Было бы полезно, если бы мы знали, какая у вас целевая версия OpenGL.В OpenGL 1.x в режиме Immediate вы настраиваете «матрицу камеры» (у OpenGL ее нет, вы просто оставляете ее транспонирование в стеке матриц), затем нажимаете и извлекаете матрицы для каждой модели в цикле рендеринга.

Используя расширения OpenGL 2.x или 1.xARB, вы можете поместить ваши преобразования в единообразные матрицы и затем обновить униформу для каждой модели.Это на самом деле не особо выгодно, так как обновление униформы также медленное.

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

Как говорится, перепроектирование его с помощью VBO и предоставление преобразований в атрибутах, вероятно, является большой работой для8% выигрыша в использовании процессора.8% на одно ядро, вероятно, 2,0 ГГц Core 2 Duo

EDIT

Единообразный буферный объект - это то, что я действительно хотел.Вероятно, для равномерной компоновки блоков.Синяя книга (и, возможно, Оранжевая книга) и Google содержат более подробную информацию.

...