Передача вершин положения частиц (glm vec3s) в буферные объекты вершин

У меня есть частица и класс системы частиц. В моей основной программе я создал экземпляр системы частиц и инициализировал частицы в ней. В функции отображения я хотел бы передать положение всех частиц в буфер вершин за один выстрел. Но я не уверен в нотации, используемой для доступа ко всем вершинам позиции из.

class particle{
glm::vec3 pos;
glm::vec3 vel;
}class particleSystem{
std::vector<particle> m_particles;
}

Я попробовал что-то вроде этого:

//Displaying particles starts here
glGenBuffers(1, &particleBuffers);
glBindBuffer(GL_ARRAY_BUFFER, particleBuffers);
glBufferData(GL_ARRAY_BUFFER, sizeof(ps.m_particles[].pos), ps.m_particles[].pos, GL_STATIC_DRAW);
glVertexAttribPointer(position_loc, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_POINTS, 0, (GLsizei)ps.m_particles.size());         //Draw them to screen
glBindBuffer(GL_ARRAY_BUFFER, 0);
//Displaying particles ends here

где ps является экземпляром класса частиц системы. Нотация, которую я использовал для доступа ко всем позициям частиц в функции glBufferData, не работает. Какие-либо предложения?

1

Решение

Я хотел бы рассмотреть возможность загрузки все Вектор частиц в GPU выглядит так:

struct particle {
glm::vec3 pos;
glm::vec3 vel;
};

[...]

glBufferData          (GL_ARRAY_BUFFER, sizeof (particle) * ps.m_particles.size (),
&ps.m_particles [0], GL_STATIC_DRAW);
glVertexAttribPointer (position_loc, 3, GL_FLOAT, GL_FALSE, sizeof (particle), 0);

Я не уверен, как ваш исходный код на самом деле работал, эти поля имеют частный доступ по умолчанию, если вы объявляете particle как класс.

Здесь нужно упомянуть два момента:

  1. &ps.m_particles [0] это стандартный метод для получения указателя на непрерывный блок памяти, представляющий хранилище данных вашего вектора.

  2. Поскольку ваша структура данных частиц содержит два поля, ваш шаг не равен нулю.

    • Это второй по значению параметр в вызове glVertexAttribPointer (...),

В качестве альтернативы, вы можете рассмотреть отдельную структуру данных для хранения данных, которые вам действительно нужны для рендеринга, из данных, которые вам нужны для моделирования на стороне процессора:

struct particle_vtx {
glm::vec3 pos;
//glm::vec3 color;
};

struct particle_state {
glm::vec3 vel;
//GLuint texture;
};

[...]

class particleSystem {
std::vector<particle_vtx>   m_particle_verts;
std::vector<particle_state> m_particle_states;
};

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

3

Другие решения

Вы должны передать целочисленное значение в оператор векторного массива. Если вы пытаетесь создать массив glm::vec3 перейти в glBufferDataвам придется делать это вручную — возможно, с помощью цикла for и динамического выделения.

0

По вопросам рекламы [email protected]