【问题标题】:OpenGL: Using VBO with std::vectorOpenGL:将 VBO 与 std::vector 一起使用
【发布时间】:2013-01-09 11:36:58
【问题描述】:

我正在尝试加载一个对象并使用 VBO 和 glDrawArrays() 来渲染它。问题是像float f[]={...} 这样的简单浮点指针在我的情况下不起作用,因为我通过了该指针可以存储的值的限制。所以我的解决方案是使用向量。而且它不工作......

这是我的代码:

unsigned int vbo;
vector<float*> vert;

...
vert.push_back(new float(i*size));
vert.push_back(new float(height*h));
vert.push_back(new float(j*size));
...

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vert), &vert, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

并渲染:

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);

我在glBufferData() 上遇到问题,其中第三个参数是const GLvoid *data。我正在传递 &amp;vert 但它不起作用。

【问题讨论】:

    标签: c++ opengl pointers stdvector vbo


    【解决方案1】:

    你想做的:

    unsigned int vbo;
    vector<float> vert;
    
    ...
    vert.push_back(i*size);
    vert.push_back(height*h);
    vert.push_back(j*size);
    ...
    
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, vert.size() * sizeof(float), vert.data(), GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    

    阅读documentation 总是好的。另外,我建议您选择一本好的 C++ 书籍,这可能是您避免犯此类错误的好方法。

    【讨论】:

    • size参数最好使用vert.size() * sizeof(float),便于携带。
    • @Kevin 事实上,仅仅使用 vert.size() 根本不起作用。只有 1/4 的 VBO 会被渲染
    【解决方案2】:

    记得检查你是否有 C++11,否则vert.data 将无法编译。

    如果您查看 std::vector 文档,您会发现 std::vector::data() 被标记为 C++11。

    http://www.cplusplus.com/reference/vector/vector/data/

    如果您没有 C++11,您可以执行以下操作:

    unsigned int vbo;
    vector<float> vert;
    
    ...
    vert.push_back(i*size);
    vert.push_back(height*h);
    vert.push_back(j*size);
    ...
    
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, vert.size(), &vert[0], GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    

    引用向量的第一个元素会给你一个指向数据本身的指针。

    【讨论】:

    • 我已经试过了,但是没有用。但我有 C++ 11 所以data 是解决方案
    • 你试过&amp;vert[0]吗?您使用的是哪个编译器?在 C++11 之前,我所有的代码都使用这种形式并且工作正常。
    • 哦,我找到了解决方案。正确的做法是vert.data()&amp;(vert[0])&amp;vert[0] 对我不起作用
    【解决方案3】:

    我可能有点晚了,但是对于其他需要帮助的人,您必须从数据的开头获取指针,这可以通过&amp;vert.front()&amp;vert[0] 完成

    所以它应该看起来像这样:

    glBufferData(GL_ARRAY_BUFFER, vert.size() * sizeof(float), &vert.front(), GL_STATIC_DRAW);
    

    【讨论】:

      猜你喜欢
      • 2013-02-08
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-17
      相关资源
      最近更新 更多