2011-08-08 9 views
8

¿Es seguro usar una matriz de vértices que está en la pila al llamar al glVertexPointer() (y las demás funciones relacionadas)? No está claro para mí cuando OpenGL realmente copia los datos de la estructura aprobada.¿Cuándo glVertexPointer() copia los datos?

Si no es seguro, ¿cómo sabe cuándo es seguro destruir/reutilizar la estructura que pasó al glVertexPointer()?

(No usar OISCIV)

+2

Para obtener la respuesta correcta, debe agregarla si está utilizando VBO. – pmr

Respuesta

6

En el caso array vértice el puntero se elimina la referencia durante la ejecución de glDrawElements() y amigos, suponiendo GL_VERTEX_ARRAY ha sido glEnableClientState() ed.

Tan pronto como glDrawElements() devuelve OpenGL tendrá todos los datos que necesita, por lo que es libre de free().

Para OISCIV que nunca pase en un puntero real, por lo que no importa :)

así que algo como esto debería funcionar:

void draw() 
{ 
    vector<float> verts; 
    verts.push_back(0); 
    verts.push_back(0); 
    verts.push_back(0); 
    verts.push_back(10); 
    verts.push_back(0); 
    verts.push_back(0); 
    verts.push_back(10); 
    verts.push_back(10); 
    verts.push_back(0); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(3, GL_FLOAT, 0, &verts[0]); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    glDisableClientState(GL_VERTEX_ARRAY); 
} 
1

glVertexPointer nunca copia de datos que simplemente establece una puntero, que se lee y se transfiere a la GPU cuando se llama a glDrawArrays y glDrawElements, después de que esas funciones hayan retornado, los datos se pueden liberar con seguridad.

+1

¡Incorrecto! ¡Los datos se pueden liberar después de glBufferData, no después de emitir comandos de dibujo! Deja de engañar a la gente. – spectre

+3

@ lukasz1985 La pregunta menciona que no está utilizando VBO, por lo que su comentario no se aplica. –

Cuestiones relacionadas