2012-10-25 5 views
7

Ich hatte einige 3D-Code, die ich nicht in einem strengen Kernprofil, aber gut in einem "normalen" Profilkontext (nicht explizit angefordert-wie-nur-Kern) merkte. Um das Problem zu isolieren, ich habe die kleinste möglichst einfache OpenGL Programm Zeichnung nur ein Dreieck und ein Rechteck geschrieben:Wie kann ich diesen einfachen OpenGL-Code (arbeitet in einem "nachsichtig" 3.3 und 4.2 Profil) in einem strengen 3.2 und 4.2 Kernprofil arbeiten?

enter image description here

ich, dass OpenGL Programm as a Gist here gebucht habe.

Mit dem useStrictCoreProfile Variable auf falsch, gibt das Programm keine Fehlermeldungen an die Konsole und zeichnet ein Quad und ein Dreieck nach dem obigen Screenshot, sowohl auf einem Intel-HD OpenGL 3.3 und auf einer GeForce mit OpenGL 4.2 .

jedoch mit useStrictCoreProfile Satz wahr, es ist die Hintergrundfarbe löscht aber nicht ziehen die drei & Quad, ist Konsolausgabe dies:

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 

... wenn ein 4.2 strenge Kern Profil wird anstelle von 3.2 angefordert, gleiches Problem. Gilt für 3 verschiedene nvidia GPUs, also gehe ich davon aus, dass ich das strikte Core-Profil nicht richtig erfülle. Was habe ich falsch gemacht, und wie kann ich das beheben?

Hinweis, nicht finden Sie einen glEnableVertexAttribArray Anruf in dem obigen Gist, wie es inside the glutil package ist ich importieren - aber als letzter Schritt bekommt compileShaders() func in dem Kern des genannt.

+1

Haben Sie versucht, die GL_ARB_debug_output Erweiterung mit nützlichen Fehlermeldungen als „GL_INVALID_OPERATION“ zu bekommen? Es ist ein bisschen mühsam einzurichten, aber es lohnt sich. – postgoodism

+0

+1 für das Teilen eines Beispiels eines möglichst einfachen OpenGL-Programms für Go – ANisus

+0

Nun, um fair zu sein, ist es nicht wirklich das "kleinste OpenGL-Programm für Go", um fair zu sein ... man könnte es reduzieren ;) – metaleap

Antwort

14

Sie erstellen/binden keine Vertex Array Object mit glGenVertexArrays() und glBindVertexArray(). VAOs kapseln eine Reihe von Vertex-Attributzuständen ein, einschließlich der aktivierten Attribute, detaillierten pro-Attributinformationen usw. Sie waren optional, wenn das Feature ursprünglich eingeführt wurde, aber jetzt sind sie in strict/core-Kontexten gemäß Abschnitt 10.4 von the OpenGL core specification erforderlich :

Ein INVALID_OPERATION Fehler durch irgendwelche Befehle erzeugt, die modifizieren, ziehen aus oder Abfrage Vertex-Array-Zustand, wenn kein Vertex-Array gebunden ist. Dies tritt im anfänglichen GL-Status auf und kann als Ergebnis von BindVertexArray oder einem Nebeneffekt von DeleteVertexArrays auftreten.

Hier ist ein sehr einfaches Beispiel dafür, wie vaos verwendet:

// 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, ich habe auf Basis deiner Antwort noch ein wenig mehr gegraben und was du sagst scheint wirklich der Fall zu sein ... werde es versuchen und es melden! – metaleap

+0

Und du hast Recht! Das ist es. Wird von nun an während der Entwicklung am Kernprofil festhalten, um solche Dinge früher zu erfassen. – metaleap

+0

Großartig! Was ich gerne sehen würde, ist ein offizielles OpenGL-Dokument (anstatt Foren-/SE-Posts), das diesen Unterschied (und andere) zwischen Kompatibilität und Kern-GL-Kontexten bestätigt, aber bis jetzt konnte ich keinen finden. – postgoodism