我有粒子和粒子系统类。在我的主程序中,我创建了一个粒子系统实例并初始化了其中的粒子。在显示功能中,我想一次将所有粒子的位置传递给顶点缓冲区。但我不确定用于访问所有位置顶点的符号。
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 函数中粒子所有位置的符号不起作用。有什么建议么?
最佳答案
我会考虑像这样将整个 粒子 vector 上传到 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
声明为一个类,这些字段默认具有私有(private)访问权限。
这里有两点需要说明:
&ps.m_particles [0]
是获取指向表示 vector 数据存储的连续内存 block 的指针的标准方法。由于您的粒子数据结构包含两个字段,因此您的步幅不为零。
- 这是调用
glVertexAttribPointer (...)
时的倒数第二个参数。
- 这是调用
或者,您可能会考虑使用一个单独的数据结构来存储您实际需要渲染的数据,这些数据来自 CPU 端模拟所需的数据:
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 需要的内容与 CPU 需要的内容分开。您将提高内存效率(在 GPU 端),并且在将顶点数据发送到 GPU 时不需要任何特殊处理。诚然,现在可以在 GPU 上完全实现有状态粒子系统,从小处着手。
关于c++ - 将粒子位置(glm vec3s)顶点传递给顶点缓冲区对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20129003/