2011-08-08 18 views
8

glVertexPointer() (ve diğer ilgili işlevler) çağrıldığında yığında bulunan bir köşe dizisi kullanmak güvenli midir? OpenGL, gerçekte geçirilen yapıdaki verileri kopyalarken açık değildir.glVertexPointer() verileri ne zaman kopyalayacaktır?

Güvenli değilse, glVertexPointer()'a ilettiğiniz yapıyı imha etmenin/yeniden kullanmanın ne zaman güvenli olduğunu nasıl anlarsınız? GL_VERTEX_ARRAY varsayarak (VBOS kullanmama)

işaretçi glDrawElements() ve arkadaşlarının çalışması sırasında duruma gelmiş olacaktır tepe dizi halinde

+2

Doğru cevabı almak için VBO'ları kullanıyorsanız eklemelisiniz. – pmr

cevap

6

, glEnableClientState() ed olmuştur.

glDrawElements(), OpenGL döndürdüğü anda gereksinim duyduğu tüm verilere sahip olacaktır, bu nedenle free()'a ücretsiz girebilirsiniz. gerçek pointer geçmek asla VBOS için

, bu yüzden gerçekten önemli :)

Yani böyle bir şey çalışması gerekir değildir:

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 asla kopyalar veri, sadece bir setleri glDrawArrays ve glDrawElements çağırdığınızda GPU'ya okunan ve aktarılan işaretçi, bu işlevler döndükten sonra verilerin serbest bırakılması güvenlidir.

+1

Yanlış! Veriler, draw komutlarını yayınladıktan sonra glBufferData'dan sonra serbest bırakılabilir! Yanıltıcı insanları durdurun. – spectre

+3

@ lukasz1985 Soru, VBO'ları kullanmadığını belirtti, bu nedenle yorumunuz geçerli değil. –

İlgili konular