2012-10-25 11 views
7

Posiadałem kod 3D, który, jak zauważyłem, nie wyświetlał się w ścisłym profilu podstawowym, ale dobrze w "normalnym" (nie jawnie żądanym as-core-only) kontekście profilu. Aby wyizolować problem, napisałem najmniejszej najprostszy rysunek programowanego OpenGL tylko trójkąt i prostokąt:Jak zrobić ten prosty kod OpenGL (działa w "łagodnym" profilu 3.3 i 4.2) działa w ścisłym profilu podstawowym 3.2 i 4.2?

enter image description here

Pisałem, że OpenGL programu as a Gist here.

Z useStrictCoreProfile zmiennej ustawiona na false, program wyświetla żadnych komunikatów o błędach do konsoli i rysuje quad i trójkąt jak na powyższym zrzucie ekranu, zarówno na Intel HD OpenGL 3.3 oraz GeForce z OpenGL 4.2 .

Jednak, z useStrictCoreProfile wartość true, to usuwa kolor tła, ale nie wyciągnąć tri & quad, wyjście konsoli to:

GLCONN: OpenGL 3.2.0 @ NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 (GLSL: 1.50 NVIDIA via Cg compiler) 
LASTERR: OpenGL error at step 'render.VertexAttribPointer()': GL_INVALID_OPERATION 
LASTERR: OpenGL error at step 'render.DrawArrays()': GL_INVALID_OPERATION 
LASTERR: OpenGL error at step 'render.VertexAttribPointer()': GL_INVALID_OPERATION 
LASTERR: OpenGL error at step 'render.DrawArrays()': GL_INVALID_OPERATION 
LASTERR: OpenGL error at step '(post loop)': GL_INVALID_OPERATION 
EXIT 

... jeśli o 4,2 ścisłym rdzeniu profil jest wymagany zamiast 3.2, ten sam problem. Dotyczy 3 różnych procesorów graficznych nvidia, więc zakładam, że nie pasuję do ścisłego profilu rdzenia. Co robiłem źle i jak mogę to naprawić?

Uwaga, nie znajdzie glEnableVertexAttribArray połączenia w powyższym Gist, jak to inside the glutil package jestem importowania - ale to nie nazywa się jako ostatni krok w GIST za compileShaders() func.

+1

Czy próbowałeś używając rozszerzenia GL_ARB_debug_output aby uzyskać bardziej użyteczne niż komunikaty o błędach „GL_INVALID_OPERATION”? To trochę kłopotliwe w konfiguracji, ale absolutnie tego warte. – postgoodism

+0

+1 za udostępnienie przykładu najmniejszego, najprostszego możliwego programu OpenGL dla Go – ANisus

+0

Cóż uczciwie, to nie * tak naprawdę * "najmniejszy najprostszy możliwy program OpenGL dla Go", by być sprawiedliwym ... można by go wyciąć ;) – metaleap

Odpowiedz

14

Nie tworzysz/nie wiążisz Vertex Array Object z glGenVertexArrays() ani glBindVertexArray(). VAO enkapsulują pęczek stanu atrybutów wierzchołków, w tym atrybuty są włączone, szczegółowe informacje o poszczególnych atrybutach itp. Były opcjonalne, gdy funkcja została pierwotnie wprowadzona, ale teraz są wymagane w kontekście ścisłym/podstawowym zgodnie z sekcją 10.4 z the OpenGL core specification :

błąd INVALID_OPERATION są generowane żadne polecenie, które modyfikowania, wyciągnąć z lub wierzchołek zapytanie tablicy stanów, gdy matryca nie jest związany wierzchołek. Występuje w początkowym stanie GL i może wystąpić w wyniku BindVertexArray lub efektu ubocznego DeleteVertexArrays.

Oto bardzo szorstki przykład jak VAOs służą:

// At initialization time: 
GLuint vao = 0; 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 
// Set up your vertex attribute state: 
// - glBindBuffer(GL_ARRAY_BUFFER,...); 
// - glEnableVertexAttribArray(...); 
// - glVertexAttribPointer(...); 
// - etc. -- Refer to OpenGL docs to see what is/isn't included in the VAO! 
glBindVertexArray(0); // unbinds vao 

// At draw time: 
glBindVertexArray(vao); // automatically sets up previously-bound vertex attribute state 
glDrawArrays(...); 
glBindVertexArray(0); // unbinds vao 
+0

Wow, wykopałem trochę więcej w oparciu o twoją odpowiedź, a to, co mówisz, wydaje się być prawdą ... spróbuję i zgłoś się ponownie! – metaleap

+0

I masz rację! to jest to! Będą trzymać się profilu rdzenia od teraz, podczas tworzenia, aby złapać takie rzeczy wcześniej. – metaleap

+0

Świetnie! To, co chciałbym zobaczyć to oficjalny dokument OpenGL (a nie posty forum/SE), który potwierdza tę różnicę (i inne) między kompatybilnością a podstawowymi kontekstami GL, ale jak dotąd nie udało mi się go znaleźć. – postgoodism