2011-08-08 10 views
8

Czy można bezpiecznie używać tablicy wierzchołków, która jest na stosie podczas wywoływania glVertexPointer() (i innych powiązanych funkcji)? Nie jest dla mnie jasne, kiedy OpenGL faktycznie kopiuje dane z przekazanej struktury.Kiedy funkcja glVertexPointer() kopiuje dane?

Jeśli nie jest bezpieczne, to skąd wiadomo, kiedy można bezpiecznie zniszczyć/ponownie wykorzystać strukturę przekazaną do: glVertexPointer()?

(nie używając VBOs)

+2

Aby uzyskać poprawną odpowiedź, powinieneś dodać, jeśli korzystasz z VBO. – pmr

Odpowiedz

6

W przypadku tablicy wierzchołek wskaźnik będzie dereferencjonowane podczas wykonywania glDrawElements() i przyjaciół, zakładając GL_VERTEX_ARRAY została glEnableClientState() ed.

Gdy tylko glDrawElements() powróci, OpenGL będzie zawierał wszystkie potrzebne dane, dzięki czemu uzyskasz dostęp do free().

Dla VBOs nigdy nie przechodzą w prawdziwym wskaźnikiem, więc to naprawdę nie ma znaczenia :)

Więc coś jak to powinno działać:

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 nigdy nie kopiuje dane, to po prostu ustawia wskaźnik, który jest odczytywany i przesyłany do procesora graficznego po wywołaniu glDrawArrays i glDrawElements, po zwróceniu tych funkcji dane można bezpiecznie zwolnić.

+1

Wrong! Dane można zwolnić po glBufferData, a nie po wydaniu poleceń rysowania! Przestań wprowadzać w błąd ludzi. – spectre

+3

@ lukasz1985 Pytanie wspomniało, że nie korzysta z VBO, więc twój komentarz nie ma zastosowania. –

Powiązane problemy