2013-06-28 3 views
0

première question sur le site, donc je suis désolé si je fais quelque chose d'inhabituel. J'ai décidé de poster une quantité minimale de mon code actuel et plutôt des liens vers les didacticiels que j'ai suivis parce que je publierais une bonne quantité de fichiers. Pour ceux qui supportent avec moi, vous n'avez aucune idée de combien je l'apprécie.Objectif C++ OpenGL implémentation

Je développe actuellement un moteur multi-plateforme en C++ pour le rendu graphique, plus un projet amusant qu'une nécessité. Ma plate-forme de développement principale est mon Macbook Pro, j'ai donc décidé que la première partie du moteur que je voudrais mettre en œuvre est le port Mac. Parce que je veux que l'application se comporte comme une application native, j'ai décidé que je voulais utiliser Cocoa pour le frontal.

J'ai suivi this tutorial et cela a bien fonctionné avec la démo qui l'accompagne, ainsi qu'avec le premier tutoriel sur le site Web de lazyfoo. J'ai fait des tutoriels il y a plus d'un an, mais je voulais vérifier et m'assurer de savoir comment mettre en œuvre ce que j'ai appris il y a quelques temps.

Ce n'est que lorsque j'ai eu the second tutorial que j'ai eu des problèmes. Donc, en éditant la classe tut01_renderer, j'ai jusqu'ici ajouté une variable, la variable entière gColorMode utilisée par lazyfoo dans son tutoriel pour la comparaison dans sa méthode de rendu. J'ai tenté d'initialiser gColorMode à 0 (cyan) dans l'en-tête, la méthode init de tut01renderer, ou les deux. Enfin, dans la la méthode render tut01renderer, je mets un if/else:

if(gColorMode == 0) 
    { 

    //Solid Cyan 
     glBegin(GL_QUADS); 
     glColor3f(0.f, 1.f, 1.f); 
     glVertex2f(-0.5f, -0.5f); 
     glVertex2f( 0.5f, -0.5f); 
     glVertex2f( 0.5f, 0.5f); 
     glVertex2f(-0.5f, 0.5f); 
     glEnd(); 
    } 
    else 
    { 
     //RYGB Mix 
     glBegin(GL_QUADS); 
     glColor3f(1.f, 0.f, 0.f); glVertex2f(-0.5f, -0.5f); 
     glColor3f(1.f, 1.f, 0.f); glVertex2f( 0.5f, -0.5f); 
     glColor3f(0.f, 1.f, 0.f); glVertex2f( 0.5f, 0.5f); 
     glColor3f(0.f, 0.f, 1.f); glVertex2f(-0.5f, 0.5f); 
     glEnd(); 
    } 

Cela entraîne trois scénarios quand je lance, et peu importe la façon dont je l'initialisés gColorMode, chacun des 3 arrive.

1) Il se bloque à l'une des erreurs malloc, à la modification d'une objection libérée OU à une erreur d'accès incorrect dans l'assemblage. 2) Montre le carré cyan comme il se doit 3) Affiche le multi-carré!

J'ai même fait de gColorMode une constante et il montre parfois encore le multi-carré ou les plantages! Donc, ma question est de savoir si je fais quelque chose de mal ou de non-connu. Suis-je autorisé à avoir une instruction if/else dans la méthode render? La démo de code squelettique originale utilisait des variables, mais pas des instructions if/else? Y at-il quelque chose à propos de Objective C++ qui rend ce que j'essaye de faire impossible? Ou est autre chose?

(Enfin, je serai heureux de réimplémentez cela est dans la plaine C et objectif C si quelqu'un connaît un tutoriel assez bon. Évident mon moteur est en C++, mais il pourrait être plus facile d'ensemble pour aller avec cette approche.)

+0

Je suggère de quitter rapidement l'ancienne fonctionnalité OpenGL obsolète que vous utilisez (appelée "pipeline à fonction fixe") et de lire cet excellent tutoriel sur la programmation OpenGL moderne: http://www.arcsynthesis.org/gltut/ –

+0

Je ne vois rien de mal dans votre approche, cela devrait fonctionner. Si vous voulez, ça ne me dérange pas de jeter un coup d'œil à votre projet. Cependant, comme Victor Sand a dit qu'il est recommandé de passer de l'ancien style OpenGL. Je trouve le tutoriel d'arcsynthesis un peu déroutant d'un point de vue mac. http://www.reddit.com/r/opengl sidebar sur la droite a quelques excellents tutoriels et vous pouvez les vérifier. – TheAmateurProgrammer

+0

Il devait y avoir quelque chose de mal avec l'en-tête parce que j'étais capable de refaire le programme dans un fichier de projet entièrement nouveau et cela a fonctionné. Typiquement, je reçois ces erreurs aléatoires lorsque j'ai des erreurs d'en-tête. Je ne peux toujours pas trouver l'erreur en question, mais heureusement j'ai un programme de travail. Merci à tous pour l'aide! (Travaillant définitivement à l'apprentissage de GLSL) – TheLostDays

Répondre

0

Vous pouvez utiliser les structures de contrôle que vous voulez (if/else, pour les boucles, etc.) lorsque vous appelez des fonctions OpenGL, tant que vous ne dérangez pas la commande. Par exemple. pour chaque glBegin(), il doit y avoir un glEnd() correspondant, et glVertex doit être appelé entre glBegin et glEnd. Le code que vous avez posté semble bien. En supposant qu'il y ait une erreur dans votre code, il doit être ailleurs.

Je voudrais définir gColorMode à 0 et définir un point d'arrêt où vous dessinez le quad multicolore. Découvrez pourquoi il prend ce chemin. Vous pouvez également définir un point d'arrêt de données qui se déclenche lorsque gColorMode change. Si cela ne vous dit rien, parcourez votre code avec un débogueur et découvrez quel appel de fonction provoque cette "erreur d'accès incorrect".

Je ne sais pas quoi d'autre à vous dire sans pouvoir regarder plus de code.