简体   繁体   English

OpenGL:将 VBO 与 std::vector 一起使用

[英]OpenGL: Using VBO with std::vector

I'm trying to load an object and use VBO and glDrawArrays() to render it.我正在尝试加载一个对象并使用 VBO 和 glDrawArrays() 来渲染它。 The problem is that a simple float pointer like float f[]={...} does not work in my case, because I passed the limit of values that this pointer can store.问题是像float f[]={...}这样的简单浮点指针在我的情况下不起作用,因为我传递了该指针可以存储的值的限制。 So my solution was to use a vector.所以我的解决方案是使用向量。 And it's not working...它不起作用......

Here is my code:这是我的代码:

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

and to render:并呈现:

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

I'm having problem on the glBufferData() where the 3rd parameter is const GLvoid *data .我在第三个参数是const GLvoid *dataglBufferData()上遇到问题。 I'm passing &vert but It's not working.我正在通过&vert但它不起作用。

You want to do:你想做:

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

It is always good to read the documentation .阅读文档总是好的。 Also, I would suggest you pick up a good C++ book, which probably would be a good way for you to avoid doing mistakes like these.另外,我建议您选择一本好的 C++ 书籍,这可能是您避免犯此类错误的好方法。

Remember to check if you have C++11 or vert.data won't compile.记得检查你是否有 C++11 或vert.data不会编译。

If you look at the std::vector doc you'll that std::vector::data() is tagged with C++11.如果您查看std::vector文档,您会发现std::vector::data()被标记为 C++11。

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

If you don't have C++11 you can do the following:如果您没有 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);

Taking a reference to the first element of a vector gives you a pointer to the data itself.引用向量的第一个元素会给你一个指向数据本身的指针。

I might be a bit late, but for anyone else who needs help on this, you have to obtain a pointer from the start of the data which can be done with &vert.front() or &vert[0]我可能有点晚了,但是对于任何需要帮助的人,您必须从数据的开头获取一个指针,这可以使用&vert.front()&vert[0]

So it should look something like this:所以它应该看起来像这样:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM