-
GLSL et Delphi
Bonsoir,
Je n'ai pas trouvé de documentation sur l'utilisation de l’OpenGL Shading Language sous Delphi si ce n'est un malheureux bout de code incompilable. D'habitude ça ne pose pas de problèmes car les exemples en c/c++ sont aisément traduisibles. Cette fois ci je bloque à la première ligne. J'ai essayé de suivre les étapes prescrites par de nombreux tutoriaux et par l'Orange Book. La première chose que j'écris est alors :
Code:
Var v : GLhandleARB;
et
Code:
v := glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
Ca tourne tant que je n'appelle pas la fonction qui exécute ce code, sinon l'application plante après avoir laissé derrière elle un "acces violation". Donc aucun problème à la compilation, la fonction glCreateShaderObjectARB est d'ailleurs bien définie dans GLext.pas.
Je m'excuse à l'avance s'il s'agit d'une erreur bête. :roll:
J'utilise Delphi 7.
-
je ne sais pas si tu connais ce site :
http://www.delphi3d.net/
tu y trouvera peut-etre des sources intéressantes pour t'aider à travailler avec les shaders :wink:
-
T'es sur que ta carte graphique/pilote prennent en charge le GLSL ? pcq à priori, la fonction CreateShaderARB n'est pas initialisé par la fonction initOpenGL, enfin, c'est ce que je pense. Peux tu nous communiquer le modèle de ta carte ?
-
Sur Delphi3D il y a effectivement un source "simplegsl". Il fait appel à une fonction LoadShaderFromFile() qui fait appel à LoadShader() qui utilise glCreateShaderObjectARB() qui stock aussi le résultat dans un GLhandleARB et qui prend aussi GL_VERTEX_SHADER_ARB en paramètre. Donc apparemment ce code ne fait rien de plus que le mien. Néanmoins simplegsl génère une exception après l'appel de la fonction glGetObjectParameterivARB().
Ma carte graphique est une sparkle GeForce 6600 Gt.
-
je te conseillerai premièrement de mettre à jour tes drivers
ensuite, tu dois tester dans ton programme le pointeur que tu reçois pour la fonction glCreateShaderObjectARB (et pour toutes les extensions en général)
t'es tu assuré que l'extension été gérée par ta carte avec glGetString ?
-
glGetString m'indique que GL_ARB_vertex_shader est géré.
Comment je teste le pointeur ? Le simple appel de la fonction (sans stocker le pointeur résultant) fait planter l'appli.
J'ai du mal à comprendre pourquoi cette fonction ne génère pas d'erreurs sur simpleglsl...
-
GL_ARB_vertex_shader est une extension, et comme toutes les extensions, avant de pouvoir l'utiliser, il faut demander à OpenGL un pointeur vers cette dernière
en C sous windows on utilise wglGetProcAddress
en delphi, je ne sais pas
tu devrais regarder l'initialisation de simpleglsl, tu y trouvera peut-etre ce qu'il te manque
-
Tout s'éclaircit !
simpleGLSL utilise glext_LoadExtension à la place de wglGetProcAddress. J'ai utilisé glext_LoadExtension () à un moment, puis je l'ai supprimé en pensant qu'il s'agissait d'une manière peu élégante de faire la même chose que glGetString().
Je vais continuer et je vais voir si j’obtiens la même erreur que simpleGLSL.
-
glGetString permet de récupérer les infos vis à vis du contexte OpenGL que tu es en train d'utiliser
en autres une chaine de caractères listant les extensions supportées par le contexte actif au moment de l'appel à glGetString
et donc à partir de cette chaine, tu sais si une extension est supportée ou non
il faut savoir que 1 extension ne veut pas dire 1 fonction
il y a des extensions qui n'ont aucune fonction et d'autres qui en ont plusieurs dizaines
une fois que tu as validé la présence d'une extension, tu dois initialiser les pointeurs des fonctions que tu souhaites utiliser (fonctions ayant rapport avec l'extension) en utilisant donc glext_LoadExtension
comme tu récupères des pointeurs (de fonction) n'oublies pas de vérifier que ceux-ci ne sont pas NULL au moment où tu les récupères
donc pour résumer tu dois :
-rendre ton contexte opengl courant
-appeler glGetString pour connaitre les extensions
-pour chaque extension que tu souhaites utiliser
>récupérer les pointeurs vers les fonctions que tu a l'intention d'utiliser (ou toutes si tu préfères)
>vérifier que chaque pointeur est valide
- et à partir de là tu peux utiliser l'extension