【发布时间】:2016-02-09 01:45:48
【问题描述】:
我是第一次创建布料模拟。我为点质量创建了一个名为“粒子”的类,它存储所有重要信息,例如其当前和以前的位置、作用在其上的力、法线、质量......等。
我想绘制这些粒子,我只需要 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
【问题讨论】:
-
结构数组 (AoS) 与数组结构 (SoA)。