【问题标题】:OpenGL - add verticesOpenGL - 添加顶点
【发布时间】:2014-06-05 14:50:21
【问题描述】:

我有一个子函数,它读取数据流并基于它创建一个顶点数据数组。主函数反复调用该子函数并更新顶点数据数组,然后将其绑定到缓冲区并绘制。到目前为止,一切都很好。但是,我不知道如何添加顶点。 C++ 不允许您重新分配或调整整个数组的大小。我不能使用向量,因为 OpenGL 函数接受的是数组,而不是向量。

【问题讨论】:

    标签: c++ arrays opengl resize buffer


    【解决方案1】:

    您可以使用向量来填充 OpenGL 顶点缓冲区。 vector 中的值保证是连续的。有关相关语言标准的详细信息,请参见例如这些讨论:

    这意味着像下面这样的代码是安全的:

    std::vector<GLfloat> vertexPositions;
    // Populate vector with vertex positions.
    GLuint bufId = 0;
    glGenBuffers(1, &bufId);
    glBindBuffer(GL_ARRAY_BUFFER, bufId);
    glBufferData(GL_ARRAY_BUFFER, vertexPositions.size() * sizeof(GLfloat),
                 &vertexPositions[0], GL_STATIC_DRAW);
    

    微妙但关键的部分是您传入向量的第一个元素的地址,而不是向量对象的地址。

    【讨论】:

    • 有趣。来自 Java 背景,我没有立即识别向量 -> 指针 数组路径。谢谢。
    【解决方案2】:

    我会稍作修改。虽然您可以使用 &vertexPositions[0] 作为 STL 向量的开头地址,但我更喜欢使用旨在返回向量内存开头地址的函数 vertexPositions.data()。

    std::vector<GLfloat> vertexPositions;
    // Populate vector with vertex positions.
    GLuint bufId = 0;
    glGenBuffers(1, &bufId);
    glBindBuffer(GL_ARRAY_BUFFER, bufId);
    glBufferData(GL_ARRAY_BUFFER, vertexPositions.size() * sizeof(GLfloat), vertexPositions.data(), GL_STATIC_DRAW);
    

    出于多种原因,我将 STL 向量用于 OGL 数据。如果您知道大小,则很容易预先分配,并且当您添加项目时它们会增长(并保持连续)。它们很容易迭代。如果要传入交错数据,可以轻松创建结构向量。一切都一样。

    【讨论】:

    • 我没有在答案中使用 data() 方法,因为它仅在 C++11 中引入,而另一种方法适用于所有版本的 C++。无论如何,这看起来更像是评论而不是答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多