Conversation resultant d'un probleme de compilation avec OpenGL en -Werror sous FreeBSD 7.0. Il se peut que je me trompe sur certaines parties, pour toutes corrections envoyez un mail a [folays at folays dot net]. <<< Salut, /usr/local/include/GL/gl.h est fourni par le port graphics/libGL fourni par Xorg. Le purpose du #if GL_ARB_shader_objects c'est qu'ailleurs, si tu disposes de l'extension OpenGL, alors cette macro est #define a 1. Cette extension specifie le support du GLSL OpenGL Shading Language. Le port /usr/ports/x11/nvidia-driver defini en effet cette macro: /usr/X11R6/share/doc/NVIDIA_GLX-1.0/glext.h:#define GL_ARB_shader_objects 1 /usr/X11R6/share/doc/NVIDIA_GLX-1.0/glext.h:#define GL_ARB_shader_objects 1 Mais ce sont des fichiers dans un repertoire de doc/, ca m'etonneraient qu'ils soient utilises. Seule la version d'OpenGL (>= 1.4 dans glxinfo, version du support OpenGL pour les Geforce4 MX 440) garantie que le driver DOIT supporter l'extension, les autres versions (1.2 dans glxinfo, comme ma ATI Mobility Radeon 9600) ne garantissent en rien le support de l'extension, mais elle peut etre neamoins etre presente, ce qui PEUT etre dynamiquement verifie a l'execution via la fonction OpenGL 1.0 glGetString(GL_EXTENSIONS) qui permet de query au driver la liste des extensions qu'il supporte. Apres avoir verifier l'existence d'une extension, on peut recuperer pour chacune des fonctions que l'extension supporte un pointeur de fonction, via la fonction glXGetProcAddress(const char *str), qui fait l'equivalent d'un dlsym() dans le driver pour recuperer la fonction. Ca permet d'avoir une version cliente (OpenGL est un model client-server, le server (driver) et le client peuvent avoir une version differente) en 1.1 garanti sous Windows XP ou 1.4 sous Windows Vista, malgre un driver recent qui supportera au moins OpenGL version 2.0. C'est pour cela que les drivers nvidia sont en 1.4 (ils proposent l'extension GL_ARB_shader_objects) et que les drivers ATI restent en 1.2 (le driver ATI opensource ne supporte pas les shaders GLSL) car ils ne peuvent pas passer en 1.4 sans garantir la disponibilite de l'extension. Ensuite faut-il encore ne pas confondre deux versions des vertex/fragment shaders: - GL_ARB_vertex_buffer_object pour les shaders ARB, syntaxe du style ASM - GL_ARB_shader_objects,GL_ARB_shading_language_100 pour les shaders GLSL, style C Il y'a plusieurs niveau de ratification pour les extensions OpenGL: - API native (fonctions gl*) symboles accessibles directement sans dlsym(), - Extension ARB (ratifiee par ARB l'ancien bureau OpenGL, maintenant leade par Khronos Group), (namespace GL_ARB) - Extension EXT (a priori un statut a peu pres entre ARB et vendor-specific), GL_EXT_* - Extensions vendor-specific (GL_ATI_*, GL_NV_*) - Autres namespaces GL_* Il est courant qu'une extension passe par les etapes vendor-specific => EXT => ARB => native-call. Ainsi, par exemple une extension ARB precedemente accessible via glXGetProcAddress(), et ratifiee ulterieurement en native-call vera son symbole accessible directement. La convention definit ainsi les namespaces des symboles: - gl*ARB (exemple glCreateShaderObjectARB) pour les symboles ARB - gl* (exemple glCreateShaderObject) pour les symboles completement ratifies. Le #if GL_ARB_shader_objects est donc completement meaningless et pas -Werror proof, et resulte probablement d'une typo, il faut rajouter defined(). -- folays >>>