2012-10-25 1 views
7

J'avais un code 3D que j'ai remarqué qui ne s'afficherait pas dans un profil de base strict, mais dans un contexte de profil «normal» (pas explicitement demandé-comme-seul-noyau). Pour isoler le problème, je l'ai écrit le dessin du programme OpenGL plus simple possible le plus petit juste un triangle et un rectangle:Comment est-ce que je fais ce code OpenGL simple (fonctionne dans un profil "indulgente" 3.3 et 4.2) fonctionne dans un profil de noyau strict 3.2 et 4.2?

enter image description here

J'ai posté ce programme OpenGL as a Gist here.

Avec la useStrictCoreProfile variable initialisée à false, le programme délivre aucun message d'erreur sur la console et dessine un quad et un triangle comme par la capture d'écran ci-dessus, à la fois sur un OpenGL Intel HD 3.3 et sur une GeForce avec OpenGL 4.2 .

Cependant, avec useStrictCoreProfile valeur true, il efface la couleur d'arrière-plan, mais ne tire pas le quad tri &, la sortie de la console est la suivante:

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 

... si un 4.2 noyau stricte le profil est demandé au lieu de 3.2, même problème. S'applique à 3 GPU nvidia différents donc je suppose que je ne suis pas conforme au profil de base strict correctement. Qu'est-ce que je faisais de mal, et comment puis-je résoudre ce problème?

Note, vous ne trouverez pas un glEnableVertexAttribArray appel dans le Gist ci-dessus, comme il est inside the glutil package que je importe - mais cela ne se dit que la dernière étape compileShaders de l'essentiel() fonct.

+1

Avez-vous essayé d'utiliser l'extension GL_ARB_debug_output pour obtenir des messages d'erreur plus utiles que « GL_INVALID_OPERATION »? C'est un peu compliqué à mettre en place, mais ça vaut vraiment le coup. – postgoodism

+0

+1 pour avoir partagé un exemple du plus petit programme OpenGL possible pour Go – ANisus

+0

Bien, pour être honnête, ce n'est pas * vraiment * le "plus petit programme OpenGL pour Go", pour être honnête ... on pourrait le réduire ;) – metaleap

Répondre

14

Vous n'êtes pas en train de créer/lier un Vertex Array Object avec glGenVertexArrays() et glBindVertexArray(). Les objets VAO encapsulent un ensemble d'états d'attributs, y compris les attributs activés, les informations détaillées par attribut, etc. Ils étaient facultatifs lors de l'introduction de la fonctionnalité, mais ils sont maintenant requis dans les contextes strict/core selon la section 10.4 de the OpenGL core specification :

Une erreur de INVALID_OPERATION est généré par des commandes qui modifient , tirer, ou un état de réseau de sommet de requête lorsque aucune matrice de sommet est liée. Cela se produit dans l'état GL initial et peut se produire à la suite de BindVertexArray ou d'un effet secondaire de DeleteVertexArrays.

Voici un exemple très approximative de la Vaos sont utilisés:

// 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, j'ai creusé un peu plus sur la base de votre réponse et ce que vous dites semble vraiment être le cas ... va l'essayer et rendre compte! – metaleap

+0

Et vous avez raison! C'est tout. Va coller au profil de base à partir de maintenant pendant le développement pour attraper de telles choses plus tôt. – metaleap

+0

Super! Ce que j'aimerais voir, c'est un document OpenGL officiel (plutôt que des messages forum/SE) qui confirme cette différence (et d'autres) entre la compatibilité et les contextes GL de base, mais jusqu'ici je n'ai pas réussi à en trouver un. – postgoodism

Questions connexes