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

Tia*_*ann 2 c++ opengl pointers vbo stdvector

我正在尝试加载一个对象并使用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);
Run Code Online (Sandbox Code Playgroud)

并呈现:

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);
Run Code Online (Sandbox Code Playgroud)

glBufferData()对第3个参数的位置有问题const GLvoid *data.我正在路过,&vert但它没有用.

ron*_*nag 13

你想做:

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);
Run Code Online (Sandbox Code Playgroud)

阅读文档总是好的.另外,我建议你选一本好的C++书,这可能是你避免犯这样的错误的好方法.

  • 最好使用`vert.size()*sizeof(float)`作为size参数以获得更好的可移植性. (3认同)

McL*_*ary 5

记住要检查您是否具有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);
Run Code Online (Sandbox Code Playgroud)

引用向量的第一个元素可为您提供指向数据本身的指针。