c++ - VBO con std:: vector
opengl (2)
Escribí un cargador de modelos en C ++ y OpenGL. He usado std::vector s para almacenar mis datos de vértice, pero ahora quiero pasarlo a glBufferData() , sin embargo, los tipos de datos son muy diferentes. Quiero saber si hay una forma de convertir entre std::vector y el const GLvoid * documentado para glBufferData() .
Tipo de vértice
typedef struct
{
float x, y, z;
float nx, ny, nz;
float u, v;
}
Vertex;
vector<Vertex> vertices;
Llamada glBufferData ()
glBufferData(GL_ARRAY_BUFFER, vertices.size() * 3 * sizeof(float), vertices, GL_STATIC_DRAW);
Me sale el siguiente error (esperado):
error: cannot convert ‘std::vector<Vertex>’ to ‘const GLvoid*’ in argument passing
¿Cómo puedo convertir el vector a un tipo compatible con glBufferData() ?
NÓTESE BIEN. No me importa la asignación correcta de memoria en este momento; vertices.size() * 3 * sizeof(float) lo más probable es segfault, pero primero quiero resolver el tipo de error.
Esto debería funcionar:
&vertices[0]
Algunos prefieren &vertices.front() , pero eso es más tipeo y yo soy perezoso.
Para ser aún más holgazán, podrías sobrecargar glBufferData así:
template <class T>
inline void glBufferData(GLenum target, const vector<T>& v, GLenum usage) {
glBufferData(target, v.size() * sizeof(T), &v[0], usage);
}
Entonces puedes escribir:
glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);
y también evita errores (tu estructura es más grande que 3 * sizeof(float) ).
Si tiene un std::vector<T> v , puede obtener una T* apunte al inicio de los datos contiguos (que es lo que sigue OpenGL) con la expresión &v[0] .
En su caso, esto significa pasar un Vertex* a glBufferData :
glBufferData(
GL_ARRAY_BUFFER,
vertices.size() * sizeof(Vertex),
&vertices[0],
GL_STATIC_DRAW
);
O como esto, que es lo mismo:
glBufferData(
GL_ARRAY_BUFFER,
vertices.size() * sizeof(Vertex),
&vertices.front(),
GL_STATIC_DRAW
);
Puede confiar en la conversión implícita de Vertex* a void const* aquí; eso no debería ser un problema.