2011-08-12 12 views
5

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.

+1

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ź. –

+0

@ 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! –

Odpowiedz

0

Jeśli przekazujesz te same dane do glDrawElements, gdy nie używasz VBO i tych samych danych do bufora VBO. Wtedy parametry niewiele się różnią, bez FBO użyłeś GL_UNSIGNED_SHORT, a przy FBO użyłeś GL_UNSIGNED_BYTE. Więc myślę VBO połączenie powinno wyglądać tak:

glDrawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_SHORT, 0); 

Również spojrzeć this tutorial istnieją bufory VBO wyjaśnione bardzo dobrze.

+0

Powoduje, że mój sterownik graficzny przestaje reagować. A całe BUFFER_OFFSET (0) zawiera wiele samouczków. Dzięki i tak! –

+0

Czy możesz również wysyłać deklaracje dla każdej zmiennej, którą przekażesz do funkcji gl? – kravemir

2

Oprócz wspomnianego co Miro (The GL_UNSIGNED_BYTE powinny być GL_UNSIGNED_SHORT), nie sądzę chcesz użyć numVertices ale numIndices, jak w wywołaniu nie VBO.

W przeciwnym razie kod wygląda na prawidłowy i jeśli to nie rozwiąże problemu, być może błąd występuje gdzie indziej.

A przy okazji BUFFER_OFFSET(i) rzeczą jest usuaully tylko zdefiniować dla ((char*)0+(i)), więc można też po prostu przejść w bajcie offsetu bezpośredniego, zwłaszcza gdy jest to 0.

EDIT: Wystarczy zauważony inny. Jeśli użyjesz dokładnych struktur danych, których używasz do wersji innej niż VBO (co, jak zakładałem powyżej), to oczywiście musisz użyć sizeof(Vertex) jako parametru kroku w glVertexPointer.

0

Jak deklarować wierzchołki i indeksy?

Parametr size glBufferData powinna być wielkość bufora w bajtach i jeśli przejdą sizeof (wierzchołki) zwróci całkowity rozmiar deklarowanej tablicy (nie tylko to, co jest przypisane).

Spróbuj czegoś podobnego sizeof (Vertex) * numVertices i sizeof (indeksy [0]) * numIndices zamiast.

+1

Zakładając, że używa tablic (zamiast dynamicznie przydzielanej pamięci), 'sizeof (vertices)' powinno być całkowicie poprawne. Oczywiście jest to problem. –