Przesyłam przez moje funkcje tablic wierzchołków do VBO, aby zwiększyć szybkość mojej aplikacji.Problemy z używaniem VBO do renderowania wierzchołków - OpenGL
Tu był mój oryginalny tablica wierzchołek roboczy funkcja renderowania:
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);
}
Pracował wielki!
Teraz przenoszę je do VBO, a mój program spowodował, że moja karta graficzna przestała odpowiadać. Ustawienia na moich wierzchołkach i indeksach są dokładnie takie same.
Nowa konfiguracja:
vboId jest ustawiony w bsp.h tak: GLuint vboId [2];
Nie otrzymuję błędu po uruchomieniu funkcji 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);
}
I kod renderujący dla VBOS. Jestem prawie pewien, że jest tutaj. Po prostu chcę renderować to, co w VBO, tak jak robiłem w tablicy wierzchołków.
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);
}
Nie wiesz, co to jest błąd, ale jestem całkiem pewny, że mam mój funkcja renderowania źle. Szkoda, że nie było bardziej zunifikowanego samouczka na ten temat, ponieważ istnieje kilka online, ale często są one sprzeczne ze sobą nawzajem.
Czy nadal monitorujesz to pytanie i czekasz na poprawną odpowiedź lub czy porzuciłeś (lub rozwiązałeś 2 minuty po wysłaniu)? W pierwszym przypadku możesz zaktualizować pytanie lub zadać pytanie, czego nie rozumiesz. W tym drugim przypadku złą praktyką jest po prostu zrezygnować z pytania (nawet jeśli rozwiązałeś je samemu). Jeśli zauważyłeś, że błąd jest czymś całkowicie odmiennym od opublikowanych odpowiedzi, możesz opublikować i zaakceptować własną odpowiedź. –
@ Chrześcijanie Rau skończyło się na tym, aż do lepszego zrozumienia tablic wierzchołków. Potem pójdę na VBO, ponieważ myślę, że są podobne. Dziękuję Ci! –