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.