【问题标题】:How to tell a VBO to handle the given data? (cloth simulation)如何告诉 VBO 处理给定的数据? (布模拟)
【发布时间】:2018-12-05 05:10:40
【问题描述】:

我正致力于在 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 作为顶点的正确方法是什么?

是否有更好的(性能方面的)方法来做到这一点,如果有,如何以及为什么?
例如,最好使用 struct 来保存 currentPos?

【问题讨论】:

    标签: c++ opengl cloth-simulation


    【解决方案1】:

    我看不出代码有什么问题。但是有了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 上更新它(这可能会很慢),但在计算着色器中更新它可能会快得多。

    【讨论】:

    • 我明白了。感谢您为我解决这个问题!你会碰巧知道这是否是一种很好的做事方式吗?例如,由于我可以在着色器中访问类的成员,我假设该类中的所有内容都以某种方式存储在 vbo 中(包括函数?)。使用仅包含我将使用的数据的东西会更好吗?
    • @Moo 我想念你的代码,你在做什么行不通。您不能将课程发送到 glsl。看看我的编辑
    • 哦,好吧,我试了一下,得到了一些奇怪的形状。我认为这是因为我的索引缓冲区或其他原因,但我会相信你的话,因为发送这样的课程似乎有点奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2014-02-25
    • 2020-06-17
    • 2021-06-07
    • 1970-01-01
    相关资源
    最近更新 更多