如何告诉VBO处理给定的数据? (布料模拟)

时间:2018-06-26 12:59:30

标签: c++ opengl cloth-simulation

我正在努力在openGL中创建布料模拟,并且一直在尝试使用VAO和VBO进行渲染,而不是使用旧的即时模式(glBegin,glEnd)。

我认为最好只提供代码的相关部分,而不是全部。所以我目前有一个Cloth类,将质量(节点)存储在一个向量中。

class Cloth {
private:   
    std::vector<Mass>masses;
public:
    std::vector<Mass> getMasses() { return masses; };
// functions below

还有一个班级,马萨诸塞州。

class Mass {
    glm::vec3 currentPos;
    glm::vec3 oldPos;
    glm::vec3 acceleration;
// functions below

我已经像这样创建了一个VBO

glGenBuffers(1, &VBO_ID);
glBindBuffer(GL_ARRAY_BUFFER, VBO_ID);
glBufferData(GL_ARRAY_BUFFER, cloth.getMasses().size() * sizeof(Mass), &cloth.getMasses().front(), GL_DYNAMIC_DRAW);

和VAO

glGenVertexArrays(1, &VAO_ID);
glBindVertexArray(VAO_ID);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GL_FLOAT), 3*sizeof(GL_FLOAT)); // unsure about this part

根据我收集的信息,通过调用glVertexAttribPointer,您可以告诉VBO如何处理提供给它的数据。我给了它一个Mass类型的向量。
告诉我如何处理数据以便将currentPos用作顶点的正确方法是什么?

是否有更好的(性能方面)方法?如果是,如何以及为什么?
例如,最好使用一个结构来保存currentPos吗?

1 个答案:

答案 0 :(得分:0)

我没有发现代码有什么问题。但是使用vertexBuffer属性,您无需告诉openGL状态机将currentPos用作顶点,这将在顶点着色器中完成。

编辑,我发现代码有问题。我以为您只发送了原始类型。您无法将您的课程发送到GLSL代码,并希望它能正常工作。您可以发送数据,glVertexAttribPointer告诉着色器数据的布局。您正在做的事行不通。

我建议您看看https://learnopengl.com/,它对我有很大帮助,而且非常完整。

您将拥有:

layout (location = 0) in vec3 currentPos;
layout (location = 1) in vec3 oldPos;
layout (location = 2) in vec2 acceleration;

然后使用以下命令输出顶点的位置:

gl_Position = mvp*vec4(currentPos, 1.0);

您可能会作为制服发送的“模型视图投影矩阵”中的mvp。

接下来的内容超出了您的答案范围,但可能很有趣:

虽然我不确定您到底想做什么,但是您应该在顶点着色器中不能编辑顶点属性,这意味着考虑到代码现在的外观,您必须进行更新您的VBO在仿真的每一步。您可以在CPU上进行更新(这可能很慢),但是在计算着色器中进行更新可能要快得多。

相关问题