【问题标题】:OpenGL + Optimizing drawing particle objects for cloth simulationOpenGL + 优化绘制粒子对象以进行布料模拟
【发布时间】: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)。

标签: c++ opengl


【解决方案1】:

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

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

【讨论】:

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