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
и другие имеют параметр, который определяет, откуда в массиве начать рисунок.