У меня есть частица и класс системы частиц. В моей основной программе я создал экземпляр системы частиц и инициализировал частицы в ней. В функции отображения я хотел бы передать положение всех частиц в буфер вершин за один выстрел. Но я не уверен в нотации, используемой для доступа ко всем вершинам позиции из.
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, не работает. Какие-либо предложения?
Я хотел бы рассмотреть возможность загрузки все Вектор частиц в 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
как класс.
&ps.m_particles [0]
это стандартный метод для получения указателя на непрерывный блок памяти, представляющий хранилище данных вашего вектора.
Поскольку ваша структура данных частиц содержит два поля, ваш шаг не равен нулю.
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, начнем с малого.
Вы должны передать целочисленное значение в оператор векторного массива. Если вы пытаетесь создать массив glm::vec3
перейти в glBufferData
вам придется делать это вручную — возможно, с помощью цикла for и динамического выделения.