2011-06-20 14 views
8

Rdzeń kodu (wyświetlanie czerwony prostokąt):Drawing VBO z glDrawArrays działa w OpenGL 2.1, ale nie w OpenGL 3.x

//bind program, set uniforms, bind vbo 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0,0); 
glDrawArrays(GL_TRIANGLES, 0, 6); 
glDisableVertexAttribArray(0); 
//unbind vbo, unbind program 

Kiedy przełączyć kontekst OpenGL 3.x ten kod przestaje działać (Widzę tylko kolor tła), ale gdy inicjuję VAO w taki sam sposób, jak powyższy kod, a następnie wiążę VAO i wywołuję glDrawArrays, to działa.

Co może być problemem? Jak mogę narysować VBO bez użycia VAO?

(shadery są naprawdę proste, vs tylko mulitplies matryce i wyjścia ps kolor czerwony)

Odpowiedz

7

Rzućmy okiem na specyfikację OpenGL-3-core:

sekcja 2.10

Pierwszy akapit:

Przedmiotem buforowe, które mają być wykorzystane przez etapie wierzchołek GL zebranych razem w celu utworzenia wierzchołka obiekt tablicy. Wszystkie stany związane z definicją danych użytych przez procesor wierzchołka są enkapsulowane w obiekcie tablicy wierzchołkowej .

ostatni akapit:

nieprawidłowy błąd operacji jest generowane, jeśli któryś z rozkazów * Pointer określające lokalizację i organizację danych tablicy wierzchołków są nazywa natomiast zerowy jest związany z Powiązanie obiektu buforowego ARRAY BUFFER: punkt, a argumentem wskaźnika jest , a nie NULL³.

A w przypisie ³:

Ten błąd uniemożliwia utworzenie obiektu tablicy wierzchołek zawierający klienta wskaźniki tablicowe, umożliwiając jednocześnie obiekty buforowe być niezwiązany.

Lub innymi słowy: w OpenGL-3-core należy użyć VAOs

+0

myślałem że VAO są opcjonalne. (mój kod nie powoduje żadnych błędów). Więc jak powinienem używać VAO? 1 VAO = 1 model? – chris

+0

Tymczasowo użyję jednego globalnego VAO. – chris

+4

Możesz zebrać wiele modeli w jednym VAO. Zwykle kolekcjonuję siatki o podobnych właściwościach, które zawsze łączą się w VAO. Na przykład wszystkie statyczne elementy mapy silnika gry, które używają tego samego modułu cieniującego, mogą być gromadzone w jednym VAO. Sortowanie przez moduł cieniujący i właściwości materiału jest prawdopodobnie najlepszym kryterium sortowania, powiedziałbym. – datenwolf