|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||||||||
|
Invité de passage
![]() Pascal Développeur de jeux vidéo Inscription : janvier 2012 Messages : 10 ![]() |
Bonsoir !
Je travaille actuellement sur un projet personnel dans lequel je dois obtenir les meilleures performances. Après avoir suivi plusieurs tutoriels, il s'avère que je me retrouve nez à nez avec un écran noir une fois de plus. Rendu : OpenGL ES 2 + VBO Langage : C++ Lib : GLM Voici le code actuel avec les explications : Je dispose d'une classe "Caméra" contenant les attributs vue et la projection que j'initialise tout au début : Code :
- GLuint myVertexBuffer; - GLuint* myIndicesBuffer; J'ai choisis d'avoir un pointeur vers le buffer d'indices car plusieurs objet auront le même buffer pour les indices (l'ordre des indices ne change pas, je ne vois pas l'utilité d'avoir plusieurs copie). Voici les méthodes utilisés pour les crées : Code :
Code :
myVerticesBuffer = 3 myIndicesBuffer = 2 Donc j'imagine que la génération des buffers c'est correctement faite. 2 - Le code qui me permet d'afficher mon Drawable est assez simple , j'ai commenté le code inutile pour le moment : Code :
Code :
De plus, les shaders sont compilés sans erreurs et sont correct puisque je les ai déjà utilisés sur un autre projet pour android. Merci d'avance à ceux qui prendront le temps de se pencher sur mon problème. Bonne journée/soirée à vous. Pascal. Ps: j'espere avoir été assez clair, je peux vous donner d'autres informations si besoin. Voici d'autres informations supplémentaires concernant la classe Program puis les indices et vertex : Code :
Code :
|
||||||||||||||
|
|
00
|
|
|
#2 |
|
Membre confirmé
![]() Inscription : février 2006 Messages : 341 ![]() |
Je n'ai pas encore regardé en détail ton code mais j'ai une petite question pour orienter l'axe de recherche.
Si tu désactive le rendu avec shader, est ce que tu n'as plus l'écran noir et est ce que la géométrie affichée est correcte? |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Pascal Développeur de jeux vidéo Inscription : janvier 2012 Messages : 10 ![]() |
Bonjour !
Merci d'avoir pris le temps de vous pencher sur mon problème. Je m'apprêtais à désactiver le rendu avec shader et je suis finalement tombé sur une erreur (à l'aide de glGetError() ) : glUniformMatrix4fv( myId, 1, GL_FALSE, glm::value_ptr(mvp) ); Error 1282 (GL_INVALID_OPERATION) myId a pour valeur 6, ce qui est logiquement correct puisque différent de "-1". C'est une petite avancé mais ce n'est pas encore ça :/ EDIT: J'ai trouvé pour cette erreur, je transmetais "myId" au lieu de "myMVPLocation". En revanche, toujours un écran noir. |
|
|
00
|
|
|
#4 |
|
Membre confirmé
![]() Inscription : février 2006 Messages : 341 ![]() |
Tu as un écran noir avec les shaders désactivé?
On est bien d'accord que tu utilise le pipeline fixe? |
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() Inscription : septembre 2010 Messages : 1 350 ![]() |
Bonjour.
Avant toute chose, merci de m'avoir fait rire avec ce titre. L'écran désespérément noir, nous avons tous connu ça. Ensuite, je n'ai pas le temps d'examiner le code pour l'instant mais voici un conseil appris à la dure : toujours commencer simplement. Met en commentaire autant de code que possible jusqu'à revenir au triangle RGB de base à coups de glVertex. Puis utilise un VBO, passe ensuite à ton rectangle au lieu du triangle de base, et enfin active ton shader. Cela semble fastidieux mais en cinq minutes tu auras ta réponse. Deux autres conseils : * gDebugger est ton nouveau meilleur ami. * Écrire une macro THROW_GL_ERROR qu'on ajoutera partout dans le code et qui ne sera active qu'en mode debug. EDIT : Mention rayée vu qu'on est sur ES. |
|
|
20
|
|
|
#6 |
|
Invité de passage
![]() Pascal Développeur de jeux vidéo Inscription : janvier 2012 Messages : 10 ![]() |
Merci pour vos réponses !
@drcd: J'essaye sans les Shaders ce soir, je vais voir comment je dois m'y prendre. Etant avec opengl ES 2, je n'ai pas la méthode glVertexPointer, seulement glVertexAttribPointer. @DonQuiche: En effet, je vais faire ça pour voir au fur et à mesure. Concernant gDebugger, j'ai voulu l'utiliser seulement il n'est pas compatible avec Lion mais seulement Snow Leopard :/. (Je suis récemment passé sur mac pour pouvoir développer sur les Idevices -_-') Pour vous donner plus de détails, je travail sur un moteur de jeu en C++ que j'utilise ensuite dans mon projet Iphone (J'accroche pas du tout à l'objective C ^^). Le context opengl est crée depuis le code de base du SDK en objective C, j'appelle ensuite le moteur pour gérer les shaders et autres. Je me suis donc dit que le rendu fait dans le moteur ne se faisait pas du coup sur l'affichage du SDK. Y a t-il un moyen de savoir si cela fonctionne ? Pour le moment j'ai tenté un "glClearColor()" depuis le moteur et l'écran se met dans la bonne couleur, j'imagine donc que ça fonctionne. Dans un tutoriel j'ai trouvé une notion de renderBuffer et colorBuffer (http://www.raywenderlich.com/3664/op...phone-tutorial). Cela n'est pas présent dans mon code et j'ai lu sur un autre site que c'était facultatif, c'est vraiment le cas ? (Concernant les shaders, je suis pratiquement sûr qu'ils sont bons puisque je les ai utilisés sur une application Android juste avant). J'essaye cela dès que je rentre chez moi |
|
|
00
|
|
|
#7 | |
|
Expert Confirmé
![]() Inscription : septembre 2010 Messages : 1 350 ![]() |
Erf, développement sur mac en obj-c pour OGL ES, la totale... Bon courage.
Concernant les render buffers, je n'ai jamais expérimenté sur iPhone mais je vois que le site d'Apple précise : Citation:
Enfin, les shaders sont sans doute corrects, c'est plutôt sur tout ce qu'il y avant ça que porte le risque. PS : Il n'y a pas de pipeline fixe en OGL ES 2, que du programmable. Cf. correction apportée à mon précédent message, j'avais zappé le "ES". |
|
|
|
00
|
|
|
#8 | ||||
|
Invité de passage
![]() Pascal Développeur de jeux vidéo Inscription : janvier 2012 Messages : 10 ![]() |
Me revoilà,
Toujours un écran noir, je commence à croire que ce n'est pas possible, je n'ai pas vraiment le moyen de tester avec des appels sans shaders et aucun moyen de debugguer (Vive Apple -_-) J'ai eu l'idée d'utiliser mon moteur dans un projet opengl ES iphone existant pour voir ce que ça donnait. Par défaut, l'application affiche un simple carré qui tourne. Dès que j'appelle mon moteur plus rien ne s'affiche à l'écran. J'ai donc fait étape par étape des tests histoires de voir ce qui posait problème. A ma surprise, en commentant la ligne suivante, le carré est de nouveau présent. Code :
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), &vertices[0], GL_STATIC_DRAW); J'ai donc cherché et j'ai remarqué que sur IOS, il y avait une méthode différente : Code :
Code :
J'ai vu que cette méthode était présent dans "gl2ext.h", j'ai beau l'inclure celle-ci n'est toujours pas présente. Avez-vous des informations à ce sujet ? Merci d'avance ! |
||||
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() Inscription : septembre 2010 Messages : 1 350 ![]() |
D'abord, à quoi sert cette ligne : les vertex array objects (VAO) sont différents des vertex arrays (VA), ces derniers étant obsolètes. Les VAO ont été introduits dans OGL3. Concernant OGL ES 2, je crois qu'ils ne sont qu'une extension, à vérifier.
Un VAO est simplement une astuce pour économiser des commandes. Aujourd'hui, quand tu te prépares à dessiner, tu as besoin de lier divers VBO à tes attributs de shaders, ce qui implique plusieurs commandes (glBindBuffer, glEnableVertexAttribArray, glVertexAttribPointer). Au lieu de cela, tu peux simplement regrouper une fois pour toutes ces commandes dans un VAO et, lors du rendu, n'utiliser qu'une seule commande (glBindVertexArray) pour rétablir tous les états correspondants et passer directement à glDraw***. Tout cela est optionnel et tu peux très bien t'en passer. Maintenant, si tu souhaites les utiliser, concernant l'absence de glGenVertexArraysOES, si j'ai raison il ne s'agit que d'une extension (vérifier les specs pour s'en assurer) et tu dois alors voir comment les extensions sont utilisées sous OGL ES. Et traiter le cas des machines qui n'ont pas cette extension. |
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Pascal Développeur de jeux vidéo Inscription : janvier 2012 Messages : 10 ![]() |
Merci pour ces informations
Je viens de corriger le problème precedent, j'ai simplement inversé la création du VertexBuffer et celui de l'indiceBuffer Oo. Le carré en rotation de l'animation de base s'affiche donc correctement. En revanche, voilà désormais une nouvelle erreur plus explicite : "EXC_BAD_ACCESS" À la ligne : Code :
glDrawElements(GL_TRIANGLE_STRIP, sizeof(indices)/sizeof(GLubyte), GL_UNSIGNED_BYTE, (void*)0); |
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Pascal Développeur de jeux vidéo Inscription : janvier 2012 Messages : 10 ![]() |
Bonsoir,
Problème precedent réglé, il s'agissait d'une erreur avec les sommets renseignés. En revanche, retour au problème initial : Code :
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), &vertices[0], GL_STATIC_DRAW); Cette ligne correspond à une allocatione, je ne vois pas ce qui l'empêcherait. Surtout que l'allocation pour les indices fonctionne très bien plus haut. Bref, je commence à croire que ce n'est pas possible à faire |
|
|
00
|
|
|
#12 |
|
Expert Confirmé
![]() Inscription : septembre 2010 Messages : 1 350 ![]() |
Bonjour.
Ton code initial ne montre pas le détail de l'assignation de myVertices et le contenu de getVertices, ni la façon dont ils sont articulés avec ShapeCreator. Toutefois, le reste semble correct. As-tu vérifié au déboguage le contenu de vertices juste avant l'appel à glBufferData ? Ne serait-ce que vertices.size() ? Par ailleurs, quelle est l'erreur reçue ? PS : Tu veux bien dire qu'en plaçant un glGetError juste après cette ligne tu obtiens une erreur ? Ou voulais-tu dire autre chose par "mon application ne fonctionne plus" ? |
|
|
00
|
|
|
#13 | |||||||||||||
|
Invité de passage
![]() Pascal Développeur de jeux vidéo Inscription : janvier 2012 Messages : 10 ![]() |
Bonjour,
Voici la classe contenant les Sommets : Code :
Code :
Code :
Code :
Code :
Citation:
Voici un résumé de l'application en plus simple : 1. J'ai crée un nouveau projet OpenGL sous Xcode pour iphone. Le code de base me donne ceci : ![]() 2. Je ne supporte pas trop l'ObjectiveC, il est par ailleurs possible de mélanger l'ObjectiveC avec du c++. Après quelques tests, il s'avère que tout fonctionne en C++. J'ai donc commencé à créer un moteur de jeu en C++ que j'utilise depuis ce sample (pour les tests). 3. Le problème : Dès que j'appelle mon moteur, il n'y a plus d'affichage à l'écran (Le carré de base du projet). Après quelques tests, j'ai remarqué que c'était le cas au moment ou je faisait mon "glBufferData". Il suffit que je commente cette ligne pour que le carré de base soit présent à l'écran. En partant de ce constat, je me suis dit que le moteur n'avait pas accès au context opengl. Seulement ça ne semble pas être le cas puisque : - glGenBuffer me retourne bien un numéro - glBufferData, Pour les indices ne pose pas de problème puisque le carré de base est toujours présent. - J'arrive à charger et compiler les shaders sans problème. - glClearColor change bien la couleur de fond de l'application. Du coup je pense vraiment que ça vient de "glBufferData" mais j'ai aucune erreur lors de son appel. EDIT: Je viens de tester le glBufferData dans le projet de base OpenGL, il y a déjà l'erreur, ça ne vient donc pas du moteur. Avec le code suivant : Code :
Je viens de tester avec un autre projet utilisant les VBO (trouvé sur le net). Quand je crée mes VBO ça fonctionne cette fois-ci ... seulement l'application utilise opengl ES 1. Dès que je passe à opengl ES2, plus rien O_O.
|
|||||||||||||
|
|
00
|
|
|
#14 | ||
|
Expert Confirmé
![]() Inscription : septembre 2010 Messages : 1 350 ![]() |
Avant toute chose, je pense avoir trouvé le problème. Les deux lignes suivantes sont erronées. Le 4ème paramètre devrait être le stride en octets, or l'opérateur sizeof renvoie déjà la taille en octets, et non nombres de floats. Autrement dit il faut virer le "*4". Qui plus est l'offset pour les couleurs est également faux : la couleur est spécifiée après les composants X et Y qui mesurent chacun 4 octets, il faut donc spécifier 8 et non 3.
Code :
EDIT : Tu ferais mieux de virer ce projet de base et partir d'un projet vide. |
||
|
|
10
|
|
|
#15 |
|
Invité de passage
![]() Pascal Développeur de jeux vidéo Inscription : janvier 2012 Messages : 10 ![]() |
Merci beaucoup pour ces précisions
J'ai finalement réussi, il y a plusieurs choses qui posaient problèmes : - Le projet OpenGL offert (gentiment) par Apple est faux, il vaut mieux partir d'un projet vide. - Le quatrième paramètre est en effet en Byte, mais je l'avais corrigé entre temps en utilisant "offsetof(Vertex, r)" - Le troisième paramètre n'est pas la taille total de "vertices" mais la taille pour un Vertex. Si ça peut aider/sauver quelques jours de recherche à quelqu'un En tout cas, merci encore pour votre aide ! |
|
|
00
|
|
|
#16 |
|
Expert Confirmé
![]() Inscription : septembre 2010 Messages : 1 350 ![]() |
De rien.
Cela dit, pour le projet Appel, vu ce que tu nous en as dit je pense que le problème est que tu as pris une ancienne version, destinée aux premiers iPhones qui tournaient sous OGL ES 1. |
|
|
00
|
|
|
#17 |
|
Membre Expert
![]() Inscription : juillet 2006 Messages : 1 396 ![]() |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com