OpenGL: Using VBO with std::vector

OpenGL: Using VBO with std::vector

本文关键字:std vector with VBO Using OpenGL      更新时间:2023-10-16

我试图加载一个对象,并使用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。我正在通过&vert,但它不工作。

你想做的是:

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);

阅读文档总是好的。此外,我建议你选择一本好的c++书籍,这可能是一个很好的方法,让你避免犯这样的错误。

请记住检查您是否有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);

引用vector的第一个元素,就得到了指向数据本身的指针。

我可能有点晚了,但对于其他需要帮助的人来说,你必须从数据的开始获得一个指针,可以用&vert.front()&vert[0]完成

应该是这样的

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