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