VBOs with std::vector

廉价感情. 提交于 2019-11-26 09:21:35

问题


I\'ve written a model loader in C++ an OpenGL. I\'ve used std::vectors to store my vertex data, but now I want to pass it to glBufferData(), however the data types are wildly different. I want to know if there\'s a way to convert between std::vector to the documented const GLvoid * for glBufferData().

Vertex type

typedef struct
{
    float x, y, z;
    float nx, ny, nz;
    float u, v;
}
Vertex;

vector<Vertex> vertices;

glBufferData() call

glBufferData(GL_ARRAY_BUFFER, vertices.size() * 3 * sizeof(float), vertices, GL_STATIC_DRAW);

I get the following (expected) error:

error: cannot convert ‘std::vector<Vertex>’ to ‘const GLvoid*’ in argument passing

How can I convert the vector to a type compatible with glBufferData()?

NB. I don\'t care about correct memory allocation at the moment; vertices.size() * 3 * sizeof(float) will most likely segfault, but I want to solve the type error first.


回答1:


If you have a std::vector<T> v, you may obtain a T* pointing to the start of the contiguous data (which is what OpenGL is after) with the expression &v[0].


In your case, this means passing a Vertex* to glBufferData:

glBufferData(
   GL_ARRAY_BUFFER,
   vertices.size() * sizeof(Vertex),
   &vertices[0],
   GL_STATIC_DRAW
);

Or like this, which is the same:

glBufferData(
   GL_ARRAY_BUFFER,
   vertices.size() * sizeof(Vertex),
   &vertices.front(),
   GL_STATIC_DRAW
);

You can rely on implicit conversion from Vertex* to void const* here; that should not pose a problem.




回答2:


This should do the trick:

&vertices[0]

Some prefer &vertices.front(), but that's more typing and I'm bone lazy.

To be even lazier, you could overload glBufferData thus:

template <class T>
inline void glBufferData(GLenum target, const vector<T>& v, GLenum usage) {
    glBufferData(target, v.size() * sizeof(T), &v[0], usage);
}

Then you can write:

glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);

and also avoid bugs (your struct is bigger than 3 * sizeof(float)).



来源:https://stackoverflow.com/questions/7173494/vbos-with-stdvector

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!