Sto trasferendo le funzioni dei miei array di vertici in VBO per aumentare la velocità della mia applicazione.Problemi nell'utilizzo dei VBO per il rendering dei vertici - OpenGL
qui era il mio originale di lavoro del vertice di matrice funzione di rendering:
void BSP::render()
{
glFrontFace(GL_CCW);
// Set up rendering states
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].x);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &vertices[0].u);
// Draw
glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, indices);
// End of rendering - disable states
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
funzionava alla grande!
Ora li sto spostando in VBO e il mio programma ha effettivamente causato il blocco della mia scheda grafica. L'installazione sui miei vertici e indici è esattamente la stessa.
Nuova configurazione:
vboId è configurato nel bsp.h in questo modo: GLuint vboId [2];
Non ottengo alcun errore quando eseguo semplicemente la funzione createVBO()!
void BSP::createVBO()
{
// Generate buffers
glGenBuffers(2, vboId);
// Bind the first buffer (vertices)
glBindBuffer(GL_ARRAY_BUFFER, vboId[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// Now save indices data in buffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
}
E il codice di rendering per VBOS. Sono abbastanza sicuro che sia qui. Voglio solo rendere ciò che è nel VBO come ho fatto nell'array dei vertici.
Render:
void BSP::renderVBO()
{
glBindBuffer(GL_ARRAY_BUFFER, vboId[0]); // for vertex coordinates
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId[1]); // for indices
// do same as vertex array except pointer
glEnableClientState(GL_VERTEX_ARRAY); // activate vertex coords array
glVertexPointer(3, GL_FLOAT, 0, 0); // last param is offset, not ptr
// draw the bsp area
glDrawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));
glDisableClientState(GL_VERTEX_ARRAY); // deactivate vertex array
// bind with 0, so, switch back to normal pointer operation
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
Non sono sicuro che l'errore è, ma sono abbastanza sicuro che la mia funzione di rendering sbagliato. Vorrei che ci fosse un tutorial più unificato su questo perché ci sono un sacco online ma spesso si contraddicono a vicenda.
Stai ancora monitorando questa domanda e aspettando la risposta corretta o l'hai abbandonata (o risolta 2 minuti dopo averla postata)? Nel primo caso sentiti libero di aggiornare la domanda o di chiedere cosa non hai capito. In quest'ultimo caso è una cattiva pratica abbandonare una domanda (anche se l'hai risolta tu stesso). Se hai scoperto che l'errore è qualcosa di completamente diverso dalle risposte postate, sentiti libero di pubblicare e accettare la tua risposta. –
@Christian Rau Ho finito per rinunciare a questo fino a quando ho avuto una migliore comprensione degli array di vertici. Allora andrò per VBO perché penso che siano simili. Grazie! –