c++ opengl vector vbo

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.