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