OpenGL: проблема производительности буфера объекта - PullRequest
3 голосов
/ 07 июля 2010

У меня есть вопрос, связанный с производительностью объекта Buffer.Я рендерил сетку, используя стандартные массивы вершин (без чередования), и я хотел изменить ее на объект буфера, чтобы получить некоторое повышение производительности.Когда я представляю объект «буферы», я был шокирован, когда узнал, что использование объекта «Буферы» снижает производительность в четыре раза.Я думаю, что буферы должны увеличить производительность.Это правда?Итак, я думаю, что я делаю что-то не так ...

У меня есть рендеринг трехмерной мозаичной карты, и чтобы уменьшить объем необходимой памяти, я использую только одну плитку (набор вершин) для рендеринга всей карты.Я изменяю только координаты текстуры и значение y в позиции вершины для каждой плитки карты.Буферы для координат позиции и текстуры создаются с помощью параметра GL_DYNAMIC_DRAW.Буфер для индексов создается с помощью GL_STATIC_DRAW, потому что он не изменяется во время рендеринга карты.Итак, для каждого тайла карты буферы отображаются и не отображаются как минимум один раз.Должен ли я использовать только один буфер для текстурных координат и позиций?

Спасибо,

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

Если вам нужно обновлять буфер (ы) каждого кадра, вам следует использовать GL_STREAM_DRAW (который намекает на то, что содержимое буфера, скорее всего, будет использовано только один раз), а не GL_DYNAMIC_DRAW (который намекает на то, что они будут использованы, но использовались пару раз дообновляется).Насколько мне известно, буферы, созданные с помощью GL_STREAM_DRAW, будут обрабатываться аналогично обычным старым массивам, поэтому при его использовании следует ожидать примерно такой же производительности, что и для массивов.

Также убедитесь, что вы вызываете glMapBuffer сдля параметра доступа установлено значение GL_WRITE_ONLY, при условии, что вам не нужно читать содержимое буфера.В противном случае, если буфер находится в видеопамяти, он должен быть перенесен из видеопамяти в основную память, а затем обратно (ну, на самом деле, это зависит от драйвера ...) для каждого вызова карты.Передача большого объема данных по шине - очень реальное узкое место, в которое довольно легко попасть.

2 голосов
/ 07 июля 2010

Попробуйте переместить координаты вершины / текстуры с помощью матриц GL_MODELVIEW / GL_TEXTURE и оставить данные буфера в покое (только GL_STATIC_DRAW).например, если размер плитки 1x1, создайте прямоугольник (0, 0) - (1, 1) и установите его положение в мире с помощью glTranslate.То же самое с координатами текстуры.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...