[OpenGL] Gestion des extensions

Gestion des extensions [OpenGL] - C++ - Programmation

Marsh Posté le 07-09-2004 à 23:58:49    

Edit : voir les derniers messages pour gérer efficacement les extensions dans OpenGL.
 
[Problème résolu]
Bonjour,
 
Pour commencer, je travaille sous Dev-c++, FLTK, OpenGL.
Des petits tests simples (genre un cube 3D qui tourne, etc...) semblent montrer que OpenGL est bien fonctionnel.
J'ai besoin d'utiliser des textures 3D (rendu de volume hardware).
La carte graphique dont je dispose (Geforce3) le supporte normalement.
Cependant le compilateur me sort un :
`glTexImage3D' undeclared (first use this function)
J'ai pourtant inclu les extensions (GL/glext.h)
 
Si je force la déclaration de glTexImage3D (dans gl.h ou glext.h) ca ne marche toujours pas (pb de liens). Ne sauriez-vous pas s'il faut une librairie spéciale ?
 
Merci


Message édité par marmotte.tranquille le 14-09-2004 à 21:33:11
Reply

Marsh Posté le 07-09-2004 à 23:58:49   

Reply

Marsh Posté le 08-09-2004 à 02:54:21    

je vais ptet dire une connerie, mais il faut récupérer le point d'entrée dynamiquement non ? (un GetProcAdress() je suppose)

Reply

Marsh Posté le 08-09-2004 à 17:12:36    

Merci, je regarde cela.
Mais mon problème serait plutôt de savoir dans quelle librairie cette fonction est déclarée.

Reply

Marsh Posté le 08-09-2004 à 17:27:12    

grosso modo, si tu est sous Windows, nulle part.
les points d'entrée sont dans le driver OpenGl de la carte 3D.
c'est à toi de tester la présence de l'extension, et à récupérer le point d'entrée manuellement.
 
après je sais pas, il y a ptet des headers et des .lib (pour VS ou autre) chez nVidia/Ati ou autre pour tout récupérer par rapport à un niveau OpenGl (ie 1.2/1.4/1.5/2.0).
 
demande à Zeross, il code en OpenGl.

Reply

Marsh Posté le 08-09-2004 à 17:27:34    

marmotte.tranquille a écrit :

Merci, je regarde cela.
Mais mon problème serait plutôt de savoir dans quelle librairie cette fonction est déclarée.


 
Je crois que bjone a raison : la fonction est implémentée, mais le glext.h que tu as est une vieille version.  
 
Donc, soit tu récupères un pointeur vers la fonction (ça te permet de faire un programme portable), soit tu déclares la fonction toi-même, soit tu voles le glext.h d'une implémentation plus récente.  
 
Un truc Linux par exemple, ou BSD si tu veux de la qualité. (ceci est un troll gratuit).
 

Reply

Marsh Posté le 08-09-2004 à 17:37:46    

cette declaration se trouve bien dans le glext.h de devcpp 4.9.8.0 si ca t'interesse

Reply

Marsh Posté le 08-09-2004 à 17:53:16    

Lam's a écrit :

Je crois que bjone a raison : la fonction est implémentée, mais le glext.h que tu as est une vieille version.  
 
Donc, soit tu récupères un pointeur vers la fonction (ça te permet de faire un programme portable), soit tu déclares la fonction toi-même, soit tu voles le glext.h d'une implémentation plus récente.  
 
Un truc Linux par exemple, ou BSD si tu veux de la qualité. (ceci est un troll gratuit).


 
Désolé, j'ai du mal à suivre :
- La fonction est déclarée dans 'glext.h', il faut juste définir
#define GL_GLEXT_PROTOTYPES avant d'inclure gl.h et glext.h (je viens de le voir)
- Par contre j'ai toujours un
  [Linker error] undefined reference to `glTexImage3D@40'  
- Pour utiliser GetProcAddress() j'ai vu qu'il fallait sortir un handle sur la librairie que l'on veut charger. Le probleme est que je ne connais pas cette librairie.
 
Edit : cris56 -> je viens de le voir j'avais oublié un petit truc (cf plus haut), merci :)


Message édité par marmotte.tranquille le 08-09-2004 à 17:54:19
Reply

Marsh Posté le 08-09-2004 à 18:30:10    

marmotte.tranquille a écrit :


  [Linker error] undefined reference to `glTexImage3D@40'  


 
C'est donc que tu utilises la mauvaise librairie (le .lib).
 
As-tu downloadé les drivers nvidia ? http://developer.nvidia.com/object/sdk_home.html
 
Utilises-tu leur fichier ainsi que le .lib correct dans ta liste de linkage ?  
 
(désolé, ça fait vraiment 2 éternités que j'ai pas fait d'openGl.)

Reply

Marsh Posté le 08-09-2004 à 19:12:36    

Ca doit commencer à faire long deux éternités ;)
Mais bon ça doit être mon problème, je pensais que la lib d'opengl classique suffisait.
J'installe tout ça et je vous tiens au courant.

Reply

Marsh Posté le 08-09-2004 à 22:19:17    

Bon en fait dans leur SDK, il n'y a que les extensions propres à nVidia (que je n'utilise pas).
A priori la lib "libopengl32.a" fournie avec dev-c++ doit être < 1.2. C'est bizarre car le "glext.h" contient bien la déclaration de cette fonction : problème de version ??
Sans doute faut-il utiliser la dll windows (opengl32.dll), non ?

Reply

Marsh Posté le 08-09-2004 à 22:19:17   

Reply

Marsh Posté le 09-09-2004 à 04:30:49    

bah d'après ce que j'ai compris, sous Windows, tu utilises toujours la dll opengl32.dll, qui utilise la dll du driver de la carte 3D en fonction de la base du registre. (si y'a pas de driver déclaré, l'opengl32 fait un rendu software).
 
je suppose que la libopengl32.a doit justement "utiliser" (lier) l'opengl32.dll qui est en opengl 1.1.

Reply

Marsh Posté le 09-09-2004 à 19:22:24    

Je pense avoir trouvé la dll des drivers : "nvoglnt.dll".
D'après ce que tu dis, si je compile en liant avec libopengl32.a, je lie aussi avec opengl32.dll et nvoglnt.dll.
 
Ok je pense avoir compris il faut bien rajouter un wglGetProcAddress("glTexImage3D" );
 
 
En fait, j'ai trouvé une petite librairie (extgl) qui permet de s'affranchir de ce genre de subtilité sur http://www.levp.de/3d/
 
Merci de votre aide :hello:


Message édité par marmotte.tranquille le 10-09-2004 à 01:43:30
Reply

Marsh Posté le 13-09-2004 à 20:18:16    

Comme indiqué sur le site de Lev Povalahev, extgl n'est plus mis à jour depuis un bon moment.
 
GLEW est une nouvelle librairie basée sur extgl, un chouilla plus lourde à mettre en oeuvre, et mise à jour régulièrement. Ca se trouve ici : http://glew.sourceforge.net
 
 :hello:

Reply

Marsh Posté le 14-09-2004 à 21:31:29    

Merci, je vais éditer mon titre que ça puisse servir à d'autres personnes.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed