【问题标题】:Particle system using webgl使用 webgl 的粒子系统
【发布时间】:2014-05-27 18:03:13
【问题描述】:

对于图形课程,我们正在 WebGL 中实现粒子系统。用JavaScript做粒子模拟计算会很慢,我们教授要我们在GPU上做粒子模拟。

为了进行这个粒子模拟,我想我们上传一个包含粒子数据(位置、速度、质量等)的顶点缓冲区,然后让我的顶点着色器对模拟进行一些数学运算,并将结果写入不同的顶点缓冲区,表示粒子的下一个状态。然后我可以使用gl.POINTS 使用不同的着色器程序来渲染我的粒子。

这似乎是转换反馈,我正在从这里学习:http://open.gl/feedback

但是,WebGL 目前似乎不包含转换反馈。 This blog post 表示转换反馈将在 WebGL 2.0 中出现。确实,当我尝试像 gl.beginTransformFeedback; 这样的语句时,我收到一个错误,提示该方法未定义。

如果变换反馈不可用,我应该如何在 WebGL 中进行粒子模拟?

【问题讨论】:

    标签: opengl-es webgl particle-system


    【解决方案1】:

    一些建议

    您可以通过使用四边形而不是点来获得更大的显示灵活性。您基本上为每个粒子输入顶点数据,例如

    //localX, localY, data for particle,   data for particle, ...
         -1,      -1, gravityForParticle0, velocityForParticle0, etc..,
          1,      -1, gravityForParticle0, velocityForParticle0, etc..,
         -1,       1, gravityForParticle0, velocityForParticle0, etc..,
          1,       1, gravityForParticle0, velocityForParticle0, etc..,
         -1,      -1, gravityForParticle1, velocityForParticle1, etc..,
          1,      -1, gravityForParticle1, velocityForParticle1, etc..,
         -1,       1, gravityForParticle1, velocityForParticle1, etc..,
          1,       1, gravityForParticle1, velocityForParticle1, etc..,
         -1,      -1, gravityForParticle2, velocityForParticle2, etc..,
          1,      -1, gravityForParticle2, velocityForParticle2, etc..,
    

    因此,对于每个四边形的每个顶点,每个粒子的数据都是相同的。换句话说,你有

    unit vertex #0, particle0 data
    unit vertex #1, particle0 data
    unit vertex #2, particle0 data
    unit vertex #3, particle0 data
    
    unit vertex #0, particle1 data
    unit vertex #1, particle1 data
    unit vertex #2, particle1 data
    unit vertex #3, particle1 data
    
    unit vertex #0, particle2 data
    unit vertex #1, particle2 data
    unit vertex #2, particle2 data
    unit vertex #3, particle2 data
    

    现在您可以在着色器中旋转、缩放和定向四边形,并根据需要偏移它,这是 POINTS 无法做到的。

    此外,如果您的粒子系统是确定性的(因为任何粒子的位置仅基于时间),那么您可以将所有变量放入属性和制服中,然后将时间作为制服传递。

    你可以看到an example of this kind of system here。这些粒子完全在 GPU 上运行。唯一传入的是用于投影的时间和矩阵。它们处理 3D 中的粒子定向、随时间改变颜色、随时间旋转、随时间变化的速度和加速度位置,甚至随时间变化的纹理动画(参见示例中的数字)

    在这些技术之上,如果您的粒子系统不是确定性的,这意味着您的状态每帧都会发生变化,您可以通过将纹理附加到帧缓冲区对象来将状态写入纹理。如果您的机器支持浮点纹理,那么您可以写入 RGBA/FLOAT 并在后续绘制调用中将该纹理作为顶点或片段着色器的输入读取。

    There's an example here。您甚至可以查看用于计算的纹理。

    【讨论】:

    • quad 方法肯定对我的项目有用。我们的粒子系统是不确定的,因此您的第二个示例非常有帮助。
    【解决方案2】:

    您可以使用FBO 并使用多个纹理附件来存储您的simulation 变量。渲染比你可以使用vertex displacement 技术。

    【讨论】:

      猜你喜欢
      • 2013-02-19
      • 2014-06-10
      • 1970-01-01
      • 2011-02-09
      • 2012-06-28
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多