Je viens de découvrir cette semaine l'open GL, très intéressé par cette bibliothèque qui permet de faire de la 3D . Je souhaitais programmer chez moi..
J'utilise le logiciel Dev-C ++ pour programmer en C ++ (logique) et je suis allé sur le site www.nehe.com pour télécharger les codes sources qui ne marchent pas ! J'ai inclus toutes les biblotheque glu.h , gl.h mais je me retrouve avec une avalanche d'erreur que je ne saurais débugger car je n'ai aucune connaissance en la matière, si quelqu'un utilise Dev C ++ pourrait t-il m'aider les problemes sont
Code :
[Linker error] undefined reference to `glViewport@16'
en faite pour tout mes appels à Gl j'ai un message de ce type..
J'ai fais des recherches pour apprendre à zéro l'openGL mais je crois que ca demande pas mal de notion en mathématique et vu que je suis très mauvais aie aie.
Je crois que je vais abandonner... car ca fait 5 jours que je cherche et j'ai toujours rien appris..
Message édité par zell789 le 04-02-2007 à 18:38:19
C'est un problème lors de l'édition des liens comme Dev-C++ te le dis en te signalant : [Linker error]
Citation :
J'ai inclus toutes les biblotheque glu.h , gl.h
ça ce ne sont pas des bibliothèques juste les fichiers d'en tête qui donnent les définitions des fonctions, les bibliothèques dans le cas d'OpenGL c'est opengl32.lib, glu32.lib etc
Il faut que tu cherches où sont situées ces fichiers, voire que tu les télécharges et que tu spécifies leur chemin à Dev-C++ et là je ne connais pas ce logiciel donc je ne peux pas t'aider. En tout cas ne baisse pas les bras sur ce bête problème de configuration ça serait dommage tu vas voir OpenGL c'est compliqué mais passionnant
ça ce ne sont pas des bibliothèques juste les fichiers d'en tête qui donnent les définitions des fonctions, les bibliothèques dans le cas d'OpenGL c'est opengl32.lib, glu32.lib etc
J'ai également inclus les .lib je crois que je devrai repartir de tout à zéro ce qui me permettra de comprendre les problèmes ou j'ai le droit de chercher un peu...en tout cas c'est dommage j'aurai voulu avoir des codes "tout fait" pour tester certaines choses
Ce qui m'énerve c'est que ça doit etre un problème tout bête !!
Citation :
En tout cas ne baisse pas les bras sur ce bête problème de configuration ça serait dommage tu vas voir OpenGL c'est compliqué mais passionnant
Tu as raison , je vais essayer de ne pas abandonner car OpenGL a l'air passionnant ..
Zeross a raison, il est difficile d'avoir un environnement de développement qui fonctionne, mais une fois que c'est bon, tu peux te concentrer sur le contenu, et là, je ne pense pas que tu seras déçu.
Je suppose que tu travailles sous Windows (sous Linux, les problèmes sont un peu moins gros avec la plupart des distributions qui installent ça très bien). Je ne connais pas Dev-C++, donc je vais avoir du mal à te donner des conseils (pour ma part, j'utilise cygwin avec gcc/g++ sous Windows pour le développement, ça marche plutôt bien, et la plupart des trucs s'installent d'eux-même).
Il semblerait que tu ne sois pas tout seul avec ce problème avec Dev-C++. Certains l'ont résolu en allant dans le menu projet, 'project options', onglet 'general', et en mettant Win32 GUI comme type d'application.
Par ailleurs, comment compiles-tu ton programme ?
Si c'est fait semi-automatiquement, vérifie que glu32, glut32 et opengl32 sont présentes dans la liste de fichiers à lier à ton programme (dans Linker options, semble-t-il, sous Dev-C++... "-lglu32 -lglut32 -lopengl32" )
Si tu le fais en ligne de commande, il doit apparaître les librairies OpenGL et Glut, et l'ordre a parfois une importance (mêmes chaîne qu'au-dessus à mettre dans la directive de compilation pour la phase de liaison)
Bon courage, et n'hésite pas à revenir chercher de l'aide, ce serait dommage de s'arrêter à ce genre de problèmes techniques qu'on oublie par la suite (enfin pas toujours, parce que ça continue à merder de temps à autre parce que les librairies ne sont pas dans le bon ordre ou compilées de la bonne façon, c'est parfois à s'arracher les cheveux pour avoir seulement un truc qui compile).
Je développe en OpenGL sous dev-c++ Windows.
Est-ce que les fichiers gl.h et glu.h sont bien situés dans un répertoire include/GL situé dans le répertoire d'installation de dev-c++ ?
As-tu la dernière version de cet EDI (4.9.9.x) ?
Sur mon ancien système, j'avais des erreurs de compilation des programmes du bouquin "beginning opengl game programming" que je me suis acheté.
Depuis, j'ai fait une grosse MAJ hardware, avec réinstallation de win xp, et puis réinstall de dev-c++, et je n'ai plus aucune erreur.
Comme quoi, des fois au lieu de se prendre la tête, une réinstallation de l'EDI, ça le fait.
Ce qu'il faut savoir, c'est que l'équivalent des .lib de VC++ en dev-cpp sont les fichiers libxxx.a situés dans le répertoire lib du répertoire d'installation
de dev-cpp.
Donc effectivement, comme le souligne Koren, il faut bien mettre les options de compilation -lopengl32 -lglu32 -lglut32, mais il faut vérifier que les fichiers correspondant existent bien aussi.
Exemple : pour -lopengl32, il doit exister un fichier libopengl32.a dans le répertoire lib du répertoire d'installation de dev-c++.
J'ai compilé tous les "lessonxx" des tutoriels de Nehe, peux-tu m'en citer un en particulier qui te pose pb ?
Parmi les 1ers (lesson1 jusqu'à 10) c'est OK, ou c'est déjà pas bon ?
Je ne sais pas si tu as remarqué, mais à part quelques exceptions, tu peux prendre les fichiers sources spéciaux pour dev-c++ au bas de chaque page de tutoriel.
Dans dev-c++ tu as aussi une option d'importation de projet VC++ pour les tutoriels où les fichiers sources spécifiques à cet EDI ne seraient pas disponibles.
Si on fait le point ensemble des caractéristiques ( options de comp., includes, etc ...) de tes .dev problématiques, avec ceux des miens, je pourrai très certainement t'aider à les faire compiler.
Ils passent tous chez moi.
N'hesite pas !
Pour les débuts, peut-être que : http://www.siteduzero.com/tuto-3-6 [...] pengl.html et toutes les pages suivantes peut t'aider !
Y'a de l'interfaçage avec la SDL, mais je pense que tu peux trier qui fait quoi sans trop de pb.
Sinon, pour les math effectivement, va falloir s'y mettre à un moment ou à un autre. Matrices, trigonométrie, vecteurs, etc ... ! Je te rassure, je suis comme toi.
Sauf que les math ça fait beaucoup moins ch... quand tu comprend la mise en application dans des domaines intéressants, contrairement aux exemples vagues de l'école (expérience inside ) !
Message édité par cbeny38 le 05-02-2007 à 15:28:23
Il me semble que Dev c++ a un gestionnaire de package et qu'il suffit de choisir le package Opengl pour le retrouver installé comme il faut et utilisable directement (lors de la création d'un nouveau projet, il faut choisir un projet de type Opengl)
---------------
Toute l'actualité PS3, PSP et PS2 sur Playfrance.com
cbeny38 & Koren => exact je n'avais pas mis dans les options du compilateur les -lopenGl32 , -lglu32 etc etc.. voila surment pourquoi cela ne marchait car en prenant le programme 'pré-tapé' de Dev-C++ dans leurs librairies,le programme marche !
Surement car le programme 'pré tapé " n'utilisait pas GLUT ! Il faudra que je vérifie si les lib sont également bien à leurs places
Cbeny38 -> Il s'agit de la 2eme lecon avec un simple ploygone non coloré il me semble
Je ne pourrais pas t'en dire plus (et si j'y suis arrivé) car mon pc a été envoyé en réparation car il était infecté par un virus, c'est très dommage !
car en prenant le programme 'pré-tapé' de Dev-C++ dans leurs librairies,le programme marche !
Félicitations !
Maintenant, tu n'as plus qu'à t'amuser avec. Et si quelque chose n'est pas clair (même si les tutoriels NeHe sont excellents, c'est en grande partie comme ca que j'ai appris moi-même), tu sais où tu peux venir poser tes questions...
Surement car le programme 'pré tapé " n'utilisait pas GLUT ! Il faudra que je vérifie si les lib sont également bien à leurs places
Si ca compile, elles y sont. Et ne t'inquiète pas pour glut, d'une part tu n'en aura pas forcément besoin (c'est surtout un gestionnaire pour dessiner la fenêtre et gérer le clavier, mais si tu as autre chose, ce n'est pas utile... pour ma part, j'utilise souvent SDL si c'est un petit programme OpenGL sans interface et FLTK si je veux des boutons et des contrôles de partout ), et d'autre part, j'ai rarement vu OpenGL installé sans Glut, donc je suis persuadé que c'est bon si tu en as besoin.
Maintenant, tu n'as plus qu'à t'amuser avec. Et si quelque chose n'est pas clair (même si les tutoriels NeHe sont excellents, c'est en grande partie comme ca que j'ai appris moi-même), tu sais où tu peux venir poser tes questions...
Comme expliqué au dessus, le programme n'utilisait pas GLUT donc je pense que toute les librairies y étaient sauf GLUT car l'erreur se produisait quand le programme utilisait GLUT
Il va falloir que j'apprenne un petit peu la programmation Window pour ouvrir les fenetres (Et Glut car à l'iut on utilise Glut pour les fenetres) ensuite je commence vraiment l'OPEN GL
Tout se passe bien jusqu'au chapitre sur le texturing je dois inclure des nouvelles librairies sauf que l'auteur a une version anglaise du produit et je ne me retrouve pas dans les menus étant donnée que j'ai Dev C++ en francais !!
Voici le passage :
N'oubliez pas de la déclarer :
Comme pour les libs OpenGL, allez dans Project, Settings. Cliquez dans "Settings For" et mettez "All Configurations". Cliquez sur l'onglet "Link" et dans la zone de texte "Object/library modules :" tapez après opengl32.lib et glu32.lib : glaux.lib.
Je n'arrive pas à trouver le Setting for en francais et l'onglet link (=lien) , ça me gene un peu de poser une question aussi idiote mais je ne trouve pas !
Je n'ai toujours pas trouvé la solution à ce problème même sur le forum du site même on ne me répond pas, ça m'énerve de bloquer aussi betement comme ça...Tout ça parce que les liens en anglais ne correspondent pas à ceux en Francais....
Désolé pour la latence... Pour information, c'est pour ce genre de chose que j'évite les versions francisées des logiciels. Parfois les traductions sont mauvaises ou curieuses, et ca n'est pas facile de trouver de l'aide. (je ne sais plus quelle était la versions francaise de Broken pipe, mais il m'avait fallu un moment pour comprendre)
Est-ce que tu peux détailler les onglets que tu as ? Je n'ai pas moyen d'installer le soft actuellement, donc je suis un peu aveugle. Je pense que la meilleure chose à faire, c'est de chercher la case où sont indiquées les autres librairies à lier au projet, comme opengl32.lib, etc. Pour le "all configurations", c'est peut-être moins important.
Désolé pour la latence... Pour information, c'est pour ce genre de chose que j'évite les versions francisées des logiciels. Parfois les traductions sont mauvaises ou curieuses, et ca n'est pas facile de trouver de l'aide. (je ne sais plus quelle était la versions francaise de Broken pipe, mais il m'avait fallu un moment pour comprendre)
Est-ce que tu peux détailler les onglets que tu as ? Je n'ai pas moyen d'installer le soft actuellement, donc je suis un peu aveugle. Je pense que la meilleure chose à faire, c'est de chercher la case où sont indiquées les autres librairies à lier au projet, comme opengl32.lib, etc. Pour le "all configurations", c'est peut-être moins important.
Pas grave pour le temps que j'ai du attendre pour la réponse
Pour contourner le probleme j'avais décidé de le réinstaller mais en anglais cette fois, or si l'installation était en anglaise le logiciel est quand à lui devenu en Francais je ne comprend pas
Je ne peux pas te montrer maintenant mais ce soir peut etre car je suis à l'iut. Par contre j'avais également tenté de lancer l'aide du logiciel car il affiche le menu en anglais mais je n'ai trouvé aucune de mes sections que je cherchais..
Vraiment bizarre
D'ailleurs j'ai envoyé un mail à l'auteur de la leçon en esperant qu'il me réponde
Si tu ne trouves pas rapidement, je l'installerai sur ma machine... même si dans la mesure du possible, j'aimerais éviter de le faire (je ne sais pas comment il gèrerait les conflits avec MingW et Cygwin pré-installés)
Sinon, la langue, c'est un fichier supplémentaire, sans doute, si tu as réinstallé le logiciel par dessus, il doit encore être présent, d'où le logiciel en français.
C'est vraiment sympathique de ta part Koren mais je préfere également pas que tu installes Dev-C++
Citation :
Sinon, la langue, c'est un fichier supplémentaire, sans doute, si tu as réinstallé le logiciel par dessus, il doit encore être présent, d'où le logiciel en français.
Exacte je l'ai redemarré en anglais maintenant, et je ne trouve tjrs pas les menus je crois que je vais abandonner ce site... il me dise d'aller dans project,setting or setting n'existe pas j'ai "project option" et encore moins d setting for
Koren : En faite je viens de comprendre le probleme,l'auteur quand il a écrit le passage ou je ne comprend rien, s'adressait à ceux qui utilise Visual C++ d'ou les noms d'onglets incohérent
Au moins j'aurai appris quelques chosegrace à cette désinstallation...
C'est vraiment sympathique de ta part Koren mais je préfere également pas que tu installes Dev-C++
Ce n'est pas un très gros problème (de toute façon, par acquis de conscience, je devrais tester, d'autant que j'ai toujours pour projet de développer ma propre interface de développement, c'est bon pour avoir des idées).
Koren : En faite je viens de comprendre le probleme,l'auteur quand il a écrit le passage ou je ne comprend rien, s'adressait à ceux qui utilise Visual C++ d'ou les noms d'onglets incohérent
Ah oui, effectivement, du coup, c'est plus clair. Donc tu n'as juste qu'à ajouter glaux dans les librairies avec opengl32, glut32 et cie pour que ça fonctionne. Ca marche ?
Oui je vais (enfin) pouvoir m'y remettre, merci de ton aide
Quoique en cour on est entré dans le vif du sujet : manipulation de caméra (que je trouve complexe)shading,highlight,bump, algorithme de gouraud etc tec..... ca devient 'chaud' !
Je prépare mon projet d'OpenGL de fin d'année, l'intitulé est simple je dois faire une image comprenant : des transformations(rotation,translation),du "texturing",de la lumière,des interactions au clavier.
Avec le projet de fin d'année,les concours pour les écoles d'ingé,et les DST.J'espere vite finir ce projet
J'ai pensé à faire une image comprenant des sphère posées sur un sol (qui seraient en faite des billes),j'aimerai avoir des précisions tout de même aux problemes que j'ai rencontré:
-Je ne comprend pas bien comment marche les axes,parfois mes spheres tournent autour d'un axe,alors que j'aimerai qu'elles tournent sur elle-même !
-Il y a t-il une commande pour mettre une image BMP en fond d'écran,ou je dois créer un carré énorme où je collerai l'image?
-Le fait d'activer la lumière,rend t-elle obligatoirement nos objets blancs (ce qui m'arrive actuellement) mes GlColor3d sur chaque sphere n'ont plus d'éffet!
-Il y a t-il une commande pour mettre une image BMP en fond d'écran,ou je dois créer un carré énorme où je collerai l'image?
Si ce n'est pas de la 2D, tu n'a pas trop le choix, en jouant avec le cadrage (viewport). Tu peux aussi mettre ta scène dans un cube et appliquer tes textures sur chaque face à l'intérieur. Cela dit je ne saisis pas trop l'intérêt d'un fond d'écran dans un espace 3D.
Si ce n'est pas de la 2D, tu n'a pas trop le choix, en jouant avec le cadrage (viewport). Tu peux aussi mettre ta scène dans un cube et appliquer tes textures sur chaque face à l'intérieur. Cela dit je ne saisis pas trop l'intérêt d'un fond d'écran dans un espace 3D.
J'aimerai mettres mes spheres (qui répresentes des billes) sur une image BMP répresentant un bitume
Sauf que j'arrive pas charger une 2eme texture,voici le bout de code pour ceux qui cela intéresserait
Heristop=> Exacte en faite j'appelle la procédure LoadTexture dans la partie CALLBACK
Hmm... Je ne sais pas si c'est très propre de faire çà. Bon d'abord je te remercie de me faire rafraîchir la mémoire sur l'OpenGL. Cela fait quelques années que j'en avais pas fait.
Ensuite, quelque soit la librairie utilisée, généralement on retrouve ce modèle (je reprends d'après une source en SDL) :
Code :
reshape(width, height);
/* initialisation d'OpenGL */
Init();
/* boucle evenementiel */
while(1) {
/* récupération des evenements. */
callback();
/* dessin */
Render();
/* animation */
Idle();
/* swap des tampons */
SwapBuffers();
}
Le mieux je pense c'est d'initialiser tes textures dans la fonctions équivalent à Init();
Citation :
glGenLists?Je ne connais pas , je devrai faire des recherches la dessus
J'ai vu pas mal de tuto différents sur le chargement de texture,je vais peut etre changer la mienne alors
Sisi, il y a bien sûr moyen de mettre un fond d'écran 2D derrière une scène 3D et sans passer par des textures. Heureusement d'ailleurs ! Ca permet aussi de mettre des indications à l'écran au premier plan, comme des barre de vie, un hud, etc.
Je m'en suis aussi servi en vision : tu mets ce que voit la caméra derrière (une image, donc) et tu places l'objet 3D dont tu as déterminé la position devant. Si ça colle, alors c'est que l'algo de vision fonctionne
Je te conseille la démarche suivante :
* en préparation : charger l'image BMP dans un buffer
* pour le tracé :
- effacer l'écran et le Z-buffer
- désactiver l'éclairage, le Z-buffer, etc. mettre la couleur à blanc (sinon l'image est multipliée par la couleur courante, si ma mémoire est bonne, ce qui permet des effets d'ailleurs)
- placer les matrices de projection afin de dessiner le fond (mode 2D)
- se mettre dans un coin de l'écran avec glRasterpos2i(x,y)... en principe en haut à gauche ou en bas à gauche*
- indiquer dans quel sens on trace* avec glPixelZoom(1,1) ou glPixelzoom(1,-1)
- dessiner l'image avec glDrawpixels(largeur, hauteur, format=GL_BGR ou GL_RGB, type=GL_UNSIGNED_INT, pointeur vers le début de l'image)
- réinitialiser les deux matrices de projection, et les placer dans ton point de vue 3D à coup de glOrtho, glLookat, ou je ne sais quoi
- réactiver l'éclairage, le Z-buffer, tout ce que tu as besoin
- dessiner ton objet 3D normalement
J'ai du code tout prêt pour ça si tu veux, mais je ne peux pas te le sortir en dix minutes... Je vais regarder.
* Pourquoi en haut ou en bas, et pourquoi le zoom -1 ? Ben pour une raison très conne : les BMP, contrairement à la plupart des formats, sont dessinés de bas en haut. Donc selon le fichier utilisé, soit tu te mets en bas à gauche et tu montes, soit tu te mets en haut à gauche et tu descends. C'est probablement le truc qui merdoira le plus, ce que je te suggères vivement, c'est de te mettre au milieu, de lancer le tracé, et de voir comment il faut mettre le zoom et le point de départ à partir du résultat.
C'est bien à l'initialisation que tu places ce code ? Je te conseilles d'utiliser une liste d'affichage pour gérer tes textures avec glGenLists.
D'après ce que m'a raconté un spécialiste de ce genre de choses, et si j'ai bien compris, les display lists ne sont plus trop la façon de faire à la vogue. Cela dit, ça reste bien pratique quand même, et je ne me souviens plus de ce qu'il faudrait mettre à la place...
Apres des recherches sur des sites et forum GLaux aurait la réputation de ne pas etre fiable !
En faite si je connais glGenLists c'était une leçon de ce site http://glinfrench.apinc.org/index.php3, à noter que mon programme ressemble un peu au tuto de ce site et que c'est ici ou j'ai appris pour le "texturing",je me base beaucoup sur ce site pour mon programme ce qui explique aussi le peu de maitrise également
Heristop=> L'initialisation de mon programme se fait sur le call WM_Create je n'ai pas de Ini_GL
Je sens que je vais devoir tout restructurer,si tu veux je peux mettre mon code ici
Dans tout les cas je te remercie de ton aide précieuse
Sisi, il y a bien sûr moyen de mettre un fond d'écran 2D derrière une scène 3D et sans passer par des textures. Heureusement d'ailleurs ! Ca permet aussi de mettre des indications à l'écran au premier plan, comme des barre de vie, un hud, etc.
Je m'en suis aussi servi en vision : tu mets ce que voit la caméra derrière (une image, donc) et tu places l'objet 3D dont tu as déterminé la position devant. Si ça colle, alors c'est que l'algo de vision fonctionne
Apparemment ce n'est pas vraiment un fond d'écran qu'il veut, mais un sol, d'après ce que j'ai compris.
Citation :
D'après ce que m'a raconté un spécialiste de ce genre de choses, et si j'ai bien compris, les display lists ne sont plus trop la façon de faire à la vogue. Cela dit, ça reste bien pratique quand même, et je ne me souviens plus de ce qu'il faudrait mettre à la place...
Ah peut-être. Il y trois, quatre ans çà l'était encore.
Ah ben en fait, je n'ai pas eu à chercher beaucoup... Bon, il y a des tas de variantes, mais ça pourra sans doute te servir de point de départ... A noter que si l'image n'a pas la taille du fond, on peut facilement la redimensionner automatiquement en jouant sur les projections.
PS : je n'ai pas contrôlé le code, ça vient d'un programme pris au hasard, donc je crois que ça marche, mais ce n'est pas rigoureusement garanti... C'est juste le bout pour tracer l'image de fond. A noter que le premier bloc sauvegarde la projection courante, et le dernier la restaure...
Code :
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho2D(0.0, size_x, 0.0, size_y);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRasterPos2i(0, size_y);
glDrawPixels(size_x, size_y, GL_RGB, GL_UNSIGNED_BYTE, image_buffer); // 0x1909=GL_LUM pour une image monochrome
Ah peut-être. Il y trois, quatre ans çà l'était encore.
Ca date bien de trois-quatre ans, justement. Le hic, c'est que je ne sais plus pourquoi. Je me souviens que je n'arrivais pas à faire fonctionner un truc, et en allant le voir (un vrai spécialiste, même Microsoft a essayé de lui mettre la main dessus... C'est toujours bien pratique ), il m'avait dit qu'on n'utilisait plus vraiment ce genre de choses dans la mesure où ce n'était plus accéléré correctement. Ca avait un sens à une époque où des séquences de commandes pouvaient être optimisées si connues à l'avance, mais pour je ne sais plus quelle obscure raison on procédait différemment à présent.
Cela dit, comme c'est pratique, ça m'arrive encore de les utiliser...
- désactiver l'éclairage, le Z-buffer, etc. mettre la couleur à blanc (sinon l'image est multipliée par la couleur courante, si ma mémoire est bonne, ce qui permet des effets d'ailleurs)
[...]
- réactiver l'éclairage, le Z-buffer, tout ce que tu as besoin
- dessiner ton objet 3D normalement
C'est pas un peu moche tout ca (desactiver le Z-buffer -> dessiner le fond -> le reactiver -> dessiner les objets) Enfin je dis ca... j'ai un pote qui desactivait le Z-buffer pour faire des effets de particules sans avoir a recalculer l'ordre d'affichage des textures. Bizarement ca marchait, mais on s'est toujours demande pourquoi
"cannot convert AUX_RGBImageRec to 'glUint' for arguement '2 to voidglGenTexture(Glsizei,GLuint)"
Pourtant j'utilise la même méthode sauf que je changer d'image ( a la place de texture1 c'est fond),je ne comprend pas le problème...
Je peux également fournir mon code entierement mais je doute que quelqu'un ait du temps à perdre
Du temps à perdre, non, mais un coup de main, ce n'est pas un problème.
Je crois que tu as mal compris ce que faisait glGenTexture... ça crée une structure de donnée en mémoire pour ranger une texture, et ça te fournit des identifiants (des entiers non signés) pour y accéder.
Le deuxième paramètre de glGenTexture doit être un pointeur vers un ou plusieurs entiers (Gluint) et non vers les données de l'image (AUX_RGBImageRec). C'est ce que te dit le message d'erreur.
Compare :
Code :
AUX_RGBImageRec *fond;
glGenTextures (0, &fond[0]);
avec ce qu'il y a au-dessus :
Code :
unsigned texture[2];
glGenTextures (2, &texture[0]);
Une fois que tu as créé de la place pour les textures, il est temps de les charger :
- tu charges l'image dans la structure AUX_RGBmachintruc dans texture1
- tu sélectionnes la texture 0 (en utilisant l'identifiant que OpenGL a rangé dans le tableau texture après l'appel à glGenTexture)
- tu précises les paramètres d'interpolation si elle est trop petite ou trop grande (NEAREST, c'est moche mais rapide)
- et enfin, tu charges l'image dans la texture avec glTexImage2D (la texture étant rangée dans la structure texture1, dans ->data)
A partir de là, si ma mémoire est bonne, tu peux d'ailleurs désallouer texture1.
Koren & Heristop => Oui je désirerai un sol mais un fond d'écran ce serait pas mal aussi même si j'aimerai un sol pour mes billes
Je vais arreter OpenGL pour ce soir,j'ai un DST sur le traitement d'image (Fournier,Sobel..) à préparer demain,j'y reviendrai si mes révisions avancent vite
C'est pas un peu moche tout ca (desactiver le Z-buffer -> dessiner le fond -> le reactiver -> dessiner les objets)
Non, c'est standard et courant. On fait des trucs bien plus rigolos, d'ailleurs
Par exemple, si tu veux dessiner uniquement les contours d'un objet :
- tu desactives l'écriture des données (!)
- tu dessines l'objet (rien n'est affiché, mais le Z-buffer est modifié et du coup l'espace est "occupé" par un objet invisible
- tu réactives l'écriture des données
- tu passes en mode fil de fer
- tu augmente la taille des traits
- tu lui dit de ne dessiner que les triangles qui pointent... vers l'arrière (re-!) (front-culling)
- tu redessine l'objet une seconde fois
...
et magiquement, tu vois uniquement les contours de l'objet. C'est ce qui est utilisé pour le rendu qu'on qualifie (à tord) de cell shading (à ceci près qu'on ne dessine pas un objet invisible, on le dessine en bricolant l'éclairage, en mixant une texture 2D avec la texture de l'objet, enfin c'est nettement moins évident en deux mots)
L'openGL, c'est simplement un automate complexe, et il est possible de faire beaucoup de choses intéressantes quand on sait se servir du Z-buffer, du stencil buffer, et des différentes conditions. Par exemple, une vue en coupe automatique...
Citation :
Enfin je dis ca... j'ai un pote qui desactivait le Z-buffer pour faire des effets de particules sans avoir a recalculer l'ordre d'affichage des textures. Bizarement ca marchait, mais on s'est toujours demande pourquoi
Ben s'il désactive le Z-buffer, elles sont toutes affichées dans l'ordre où le programme les fournit. Ca dépend de ce qu'il voulait faire, mais à part le fait qu'on voit parfois les particules de derrière devant d'autres particules plus proche, ça marche. Et si les particules utilisent de l'alpha, ça ne peut que marcher... (enfin bon, ça dépend de ce que tu veux faire)
Koren & Heristop => Oui je désirerai un sol mais un fond d'écran ce serait pas mal aussi même si j'aimerai un sol pour mes billes
Si tu veux un fond d'écran, tu as mon code plus haut. Si tu veux un quad texturé, pas à pas :
* à l'initialisation :
- tu définis un entier qui contiendra ton numéro de texture
Code :
GLuint texture_ID
- tu demandes à la carte vidéo d'attribuer un numéro pour ta texture :
Code :
glGenTextures (1, &textureID);
(se lit comme la demande à la carte vidéo "fais-moi de la place pour 1 texture, et stocke-moi son numéro dans la variable textureID" )
- tu charges la texture en mémoire (avec GLaux, par exemple, mais tu peux aussi écrire ton propre logiciel de lecture, ou en utiliser un existant... le tout est d'avoir un buffer qui contient l'image)
Code :
AUX_RGBImageRec* image;
image = auxDIBImageLoad("bitume.bmp" );
l'image est chargée, et tu peux accéder au buffer avec image->data
- tu dis à la carte vidéo que tu vas faire des choses avec la texture que tu lui a demandé plus tôt :
Code :
glBindTexture (GL_TEXTURE_2D, textureID);
A noter qu'on lui fournit le type de texture (image 2D) parce qu'il va réserver de la place dans la mémoire vidéo, et donc il lui faut savoir combien de place il va falloir... A présent, toutes les commandes liées aux textures utiliseront la texture qui nous intéresse
- tu lui précises comment elle doit la modifier si elle est trop petite/grande :
LINEAR, ce sera moins moche... au besoin, c'est là qu'on définit des MIPMAPs pour éviter les scintillements quand la texture est très petite. Il y a aussi d'autres paramètres pour la façon dont la texture se comporte quand on sort de la zone (bouclage, inversion, etc.)
0 est là pour le niveau de détail des MIPMAPs, à laisser (de toute façon, les MIPMAPs sont bien générés automatiquement au besoin). 3, c'est le nombre de couleur à utiliser en INTERNE dans la carte (pas forcément celui de l'image). Suit la taille de l'image, le 0 ensuite correspond à la taille de la bordure (ie pas de bordure), on précise que l'image est en RGB, que les données du buffer sont des entiers 8bits non signés, et on fournit le pointeur vers les données de l'image.
- Facultatif, je crois qu'on peut libérer la mémoire centrale en virant l'image à présent inutile :
Code :
free(image);
(à vérifier, mais j'en suis sûr, c'est juste pour ne pas dire de bêtises)
Et c'est fini pour l'initialisation, la texture est en mémoire !
* à l'exécution: - chaque fois que tu as besoin de la texture, il faut dire que c'est celle-là que tu vas utiliser. Donc donner à la carte vidéo son numéro interne, textureID !
Code :
glBindTexture(GL_TEXTURE_2D, textureID);
- puis, dessiner le polygone
Code :
glBegin(GL_QUAD);
glTexCoord2f(0.0,0.0);
glVertex3f(x1, y1, z1);
glTexCoord2f(0.0,1.0);
glVertex3f(x2, y2, z2);
glTexCoord2f(1.0,1.0);
glVertex3f(x3, y3, z3);
glTexCoord2f(1.0,0.0);
glVertex3f(x4, y4, z4);
glEnd();
Si un point est obscur, dis-le...
Citation :
Je vais arreter OpenGL pour ce soir,j'ai un DST sur le traitement d'image (Fournier,Sobel..) à préparer demain,j'y reviendrai si mes révisions avancent vite
Rah, Sobel... ça me rappelle de bons souvenirs de Master 2...
EDIT : Ca fait 2 heures que je programme,et j'avance toujours pas,mes capacitées intellectuelle m'inquiete vraiment,je ne comprend rien à l'échelle X,Y,Z, même pas à dessiner des cubes 3D sans faire des copier/coller,je n'arrive trjs pas à plaquer cette texture,ou gérer manuellement la lumière (et pourquoi les couleurs disparaissent quand la lumiere est activée?)
C'était ma minute "je vide mon sac',j'y retourne..........
EDIT : Ca fait 2 heures que je programme,et j'avance toujours pas,mes capacitées intellectuelle m'inquiete vraiment
Il ne faut pas, si ça peut te rassurer, en général je merde pas mal moi-même
Il faut prendre les choses très calmement et une à une. La première chose, c'est d'avoir un truc à l'écran, quel qu'il soit. Trop souvent, l'écran est noir parce qu'il y a une caméra à l'envers ou quelque chose de ce genre. Une fois que tu as repéré la scène, on peut chercher à comprendre ce qui cloche.
Tu as mis quoi dans camx-camz, centerx-centerz et hautx-hautz ?
Si tu ne vois rien, le mieux c'est de procéder ainsi : faire une fonction Repaint à part et qu'on remplit au fur et à mesure (en rajoutant la couleur, la texture, mais une chose à la fois). Il faut :
- placer la caméra
- afficher n'importe quoi et le voir
pourquoi les couleurs disparaissent quand la lumiere est activée?
Quand la lumière est activée, tu ne devrais utiliser que du blanc comme couleur, les objets utilisent la couleur définie dans les glMaterial (qui définissent comment un objet renvoie la lumière, donc de quelle couleur il apparait). Ca n'a pas de sens de définir une couleur, puisque si la lumière est rouge, un objet bleu doit apparaître violet.
Je te recommande VIVEMENT de ne PAS utiliser la lumière avant que tout ne fonctionne. Et d'au moins toujours laisser un objet (si possible une boite autour de la scène) qui est tracé avec le GL_LIGHTING désactivé, tant que le programme n'est pas fini.
Il ne faut pas, si ça peut te rassurer, en général je merde pas mal moi-même
Je comptais avancé énormément ce soir car mercredi j'ai un concour d'entrée à préparer (l'Ecole Superieur de Genie Informatique),de plus j'ai un controle très délicat en mathématique jeudi,et c'est mon anniversaire mercredi je vais surement devoir allé au restaurant avec la famille,je n'aime pas dire que c'est une perte de temps,mais j'aimerai aussi avancer..et vu que je suis plutôt isolé dans mon groupe,je suis souvent en train de bosser seul,contrairement à d'autre qui bossent ensemble et s'entraident.Je n'aime pas jouer ma pleurnicheuse mais je vais pas me cacher non plus,et me dire que ça roule.
Ok c'est pas en pensant comme ça que je vais me sentir mieux,alors comme tu me l'as dis Koren,je vais reprendre calmement et reprendre mon programme
Citation :
Tu as mis quoi dans camx-camz, centerx-centerz et hautx-hautz ?
cam x =0
cam z = -5
haut x = 0
haut y = 1
cela me permet de les voirs directements,
Je vais tenter d'appliquer tes conseils...
EDIT : En faite ma texture était appliqué mais les spheres écrasaient,la texture.Enfin je pense pas que ce soit ça en faite ....
Message édité par zell789 le 27-03-2007 à 12:12:23