OpenGL обработка нескольких объектов

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

моей первой мыслью было, что я должен обрабатывать данные о местоположении с переменными перевода и вращения для X,Y и Z соответственно. Сохраните одну сетку в статическом VBO для этого класса, а затем для каждый экземпляр, который я хочу отобразить, делает цикл for-next для

  • личность нагрузки
  • преобразование в местоположение / вращение конкретного объекта
  • используйте drawarrays для визуализации сетки в этом месте
  • цикл к следующему объекту и повторите выше для каждого объекта

обработка таких преобразований для каждого обновления кадра значительно влияет на производительность?

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

третья мысль у меня была должен был хранить матрицу 4x4 в каждом экземпляре объекта, который будет содержать информацию о переводе/вращении, затем, когда я пойду на рендеринг, я просто загружу матрицу этого объекта, нарисую сетку из одного VBO, затем загрузите матрицу следующего объекта, нарисуйте из того же VBO и т. д....

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

допустимы ли какие-либо/все эти методы обработки/рендеринга нескольких объектов? Если да, то каковы преимущества и недостатки каждого метода?

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

1 ответов


  • преобразование в местоположение / вращение конкретного объекта

это просто означает, что вы загружаете матрицу 4x4 в однородную переменную.

обработка таких преобразований для каждого обновления кадра значительно влияет на производительность?

преобразование будет выполняться в вашем вершинном шейдере путем умножения вышеупомянутой матрицы и на координаты вершин параллельно для многих вершины.

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

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

третий метод кажется таким же, как первый, только в терминах OGL3+, где первый кажется похожим на OGL 2.х условиях :)

наконец, я видел, что некоторые люди предлагают иметь VBO для каждого отдельного объекта и вызова drawarray для каждого пример.

возможно, вы неправильно поняли, и они имели в виду ВАО, а не VBO? С помощью VAO вы загружаете атрибуты вершин (в VBOs), связываете VAO, привязываете каждый VBO к соответствующему местоположению атрибута и делаете это только один раз в начале. На каждом кадре вы просто делаете:

// Bind the VAO
glBindVertexArray(vao)

// Draw the object
glDrawArrays/glDrawArraysInstanced/etc.

// CLear VAO binding
glBindVertexArray(0)

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