【问题标题】:Passing particle position(glm vec3s) vertices to vertex buffer objects将粒子位置(glm vec3s)顶点传递给顶点缓冲区对象
【发布时间】:2013-11-21 18:25:22
【问题描述】:

我有粒子和粒子系统类。在我的主程序中,我创建了一个粒子系统实例并在其中初始化了粒子。在显示功能中,我想一次性将所有粒子的位置传递给顶点缓冲区。但我不确定用于访问所有位置顶点的符号。

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 函数中所有粒子位置的符号不起作用。有什么建议?

【问题讨论】:

    标签: c++ visual-c++ opengl particle-system


    【解决方案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. &amp;ps.m_particles [0] 是获取指向表示向量数据存储的连续内​​存块的指针的标准方法。

    2. 由于您的粒子数据结构包含两个字段,因此您的步幅非零。

      • 这是对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 上实现,从小处着手。

    【讨论】:

    • 嗯,我想到了为粒子的属性单独创建数据结构以便于访问。但后来我认为在管理代码方面拥有粒子类更合适。谢谢你的想法。
    【解决方案2】:

    您必须将整数值传递给向量数组运算符。如果您尝试创建一个 glm::vec3 数组以传递给 glBufferData,则必须手动执行此操作 - 可能通过使用 for 循环和动态分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多