VBO与std :: vector

我用C ++编写了一个OpenGL的模型加载器。 我已经使用std::vector来存储我的顶点数据,但是现在我想把它传递给glBufferData() ,但是数据types是非常不同的。 我想知道是否有一种方法来在std::vector之间转换glBufferData()logging的const GLvoid *

顶点types

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

glBufferData()调用

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

我得到以下(预期)的错误:

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

如何将vector转换为与glBufferData()兼容的types?

NB。 我现在不关心正确的内存分配。 vertices.size() * 3 * sizeof(float)最有可能是段错误,但我想先解决types错误。

如果你有一个std::vector<T> v ,你可以通过expression式&v[0]获得一个T*指向连续数据的开始(这是OpenGL的开始)。


在你的情况,这意味着传递一个Vertex*glBufferData

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

或者像这样,这是一样的:

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

你可以依赖从Vertex*void const*隐式转换。 这不应该造成问题。

这应该做的伎俩:

 &vertices[0] 

一些更喜欢&vertices.front() ,但是这是更多的打字,我懒骨头。

为了更加懒惰,你可以重载glBufferData

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

那么你可以写:

 glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW); 

并避免错误(你的结构比3 * sizeof(float) )。