[英]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 *data
的glBufferData()
上遇到问题。 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.