OpenGL +优化绘图粒子对象以进行布料模拟

时间:2016-02-09 01:45:49

标签: c++ opengl

我是第一次创建布料模拟。我已经为点质量创建了一个叫做粒子'粒子'它存储所有重要信息,例如当前和以前的位置,作用于它的力量,正常,质量......等等。

我想绘制这些粒子,我只需要currentPosition,这是该类中许多参数中的第一个(见下文)。从我微薄的经验来看,绘制这些粒子的方法似乎是将整个粒子对象数组发送到GPU然后使用Glvertexattribpointer()给它一个步幅。看起来有相当多的不必要的信息被传递到GPU但是这样做。我已经考虑过创建一个新数组并在每次迭代时使用位置数据填充它以向下发送,但是这种方法看起来像是内存和CPU功率的大量开销。

与创建仅限顶点数组相比,将不需要的数据发送到GPU所造成的损失如何?当然,我的粒子类并不大,但我认为布料需要大量的粒子,因此冗余数据可以快速加起来。我不知道这两种方法的替代方案吗?

#ifndef PARTICLE_HPP
#define PARTICLE_HPP
#pragma once
#include <atlas/utils/Geometry.hpp>
class Particle {
public:
    Particle(glm::vec3 pos);
    ~Particle();

    void addForce(glm::vec3 force);
    void updateGeometry(atlas::utils::Time const& t, GLfloat DAMPING);
    void makeMoveable();
    void makeStationary();
    void resetAcceleration();
    void setPosition(glm::vec3 newPos);
    void offSetPosition(glm::vec3 newPos);
    void addToSumOfSpringForces(glm::vec3 force);
    void setWind(glm::vec3 wind_);
    void resetNormal();
    void addToNormal(glm::vec3 V);
    glm::vec3 getCurrentPosition();
private:    
    glm::vec3 currentPosition, previousPosition, acceleration, totalSpringForces, gravity, wind, velocity, mNormal;
    GLfloat mass, dragCoefficient;
    bool stationary;
};
#endif // !PARTICLE_HPP

1 个答案:

答案 0 :(得分:0)

在某些时候,您需要分配服务器GPU内存来存储粒子数据 - 无论是位置,还是位置以及所有其他数据。无论您使用什么顶点缓冲方法(客户端缓冲区,VBO,VAO等),您的数据都需要从客户端内存复制到服务器内存(CPU到GPU)。因此,如果你需要的只是着色器中的currentPosition数据绘制粒子,分配额外的内存并复制它是浪费的,并且永远不会有效。

或者,您可以在GPU上进行粒子模拟,并完全跳过传输,假设您有足够的硬件并且不需要CPU访问粒子数据,这可能会更有效。