OpenGL: besoin d'un coup de pouce pour importer une fonction

Généralités sur la programmation 3D
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

OpenGL: besoin d'un coup de pouce pour importer une fonction

Message par Buckethead »

Je voulais faire un petit effet neige avec GL_POINTS, seulement les flocons ont la même taille qu'ils soient à 1 mètre ou à 5 Km :)

Les "points" sont très intreressant car ils ont besoin que d'un seul vertex.
De plus on peut leur attribuer une texture, pour en faire des sprites. (Au passage j'ai lu sur le web qu'il fallait OpenGL 2.0 pour les texturer, pourtant j'ai pu mettre de la texture sur mes points.)

Bref, pour avoir de la profondeur il faudrait utiliser glPointParameter. Hélàs cette fonction n'est pas disponible.

Code : Tout sélectionner

Dim coeffs.f(3): coeffs(0) = 1.0 : coeffs(1) =  0.0 : coeffs(2) = 0.0001
;Coefs atténuation
glPointParameterfv_(#GL_POINT_DISTANCE_ATTENUATION, coeffs())

;Taille du point, mini/maxi
glPointParameterf_(#GL_POINT_SIZE_MAX, 32.0)
glPointParameterf_(#GL_POINT_SIZE_MIN, 1.0)

J'ai essayé d'importer la fonction :oops:
http://www.opengl.org/sdk/docs/man/xhtm ... ameter.xml

Code : Tout sélectionner

Import "glu32.lib"
glPointParameter(pname.d,*param.f)
EndImport

; je pense plutôt dans cette lib, bien que ça soit du chinois pour moi.
Import "opengl32.lib"
glPointParameter(pname.d,*param.f)
EndImport
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Faut pas rajouter le "f_" en fin de fonction dans ton import ?

Code : Tout sélectionner

Import "opengl32.lib"
glPointParameterf_(pname.d,*param.f)
EndImport 
Lio :?:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Anonyme

Message par Anonyme »

ou ceci :

Code : Tout sélectionner

ImportC "opengl32.lib"
glPointParameterf_(pname.d,*param.f) As "_glPointParameterf@12"
EndImport
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

En fait il y a glPointParameterfv et glPointParameterf. Je crois qu'il faut importer ces deux commandes.
Au début je pensais que c'était la même commande, glPointParameter.


J'ai obtenu un message autre que "la fonction n'existe pas" en tapant ceci:

Code : Tout sélectionner

Import "opengl32.lib" 
glPointParameterfv_(a.l,b.f) As "_glPointParameterfv@12" 
EndImport

(...)

Dim coeffs.f(3): coeffs(0) = 1.0 : coeffs(1) =  0.0 : coeffs(2) = 0.0001

glPointParameterfv_(#GL_POINT_DISTANCE_ATTENUATION, coeffs())
glPointParameterf_ (#GL_POINT_SIZE_MAX, 32.0)
glPointParameterf_ (#GL_POINT_SIZE_MIN, 1.0)

Je me suis inspiré du fichier include OpenGL.pb pour les vars, en comparant d'autre fonctions ayant le même style de paramètres.

Maintenant j'ai un autre message: "constant not found".
J'ai donc regardé de nouveau dans le fichier include et ajouté ça dans mon code, après avoir checké cette page web http://www.opengl.org/registry/api/glext.h où l'on trouve ces données dans un bloc de code C++

Code : Tout sélectionner

#ifndef GL_VERSION_1_4
GLAPI void APIENTRY glPointParameterfv (GLenum, const GLfloat *);
Define GL_POINT_DISTANCE_ATTENUATION     0x8129
Après avoir ajouté, j'ai un "POLINK unresolved symbol glPointParameterfv"

Code : Tout sélectionner

#GL_POINT_DISTANCE_ATTENUATION = $8129
Anonyme

Message par Anonyme »

En fait il y a glPointParameterfv et glPointParameterf. Je crois qu'il faut importer ces deux commandes.
Au début je pensais que c'était la même commande, glPointParameter.
non, tu peut importé une seule fonction si cela te chante.
J'ai obtenu un message autre que "la fonction n'existe pas" en tapant ceci:

Code : Tout sélectionner

Import "opengl32.lib" 
glPointParameterfv_(a.l,b.f) As "_glPointParameterfv@12" 
EndImport

(...)

Dim coeffs.f(3): coeffs(0) = 1.0 : coeffs(1) =  0.0 : coeffs(2) = 0.0001

glPointParameterfv_(#GL_POINT_DISTANCE_ATTENUATION, coeffs())
glPointParameterf_ (#GL_POINT_SIZE_MAX, 32.0)
glPointParameterf_ (#GL_POINT_SIZE_MIN, 1.0)

ce n'est plus @12 mais @8 pour l'import , car un int et un float font 8 au total.
Je me suis inspiré du fichier include OpenGL.pb pour les vars, en comparant d'autre fonctions ayant le même style de paramètres.

Maintenant j'ai un autre message: "constant not found".
J'ai donc regardé de nouveau dans le fichier include et ajouté ça dans mon code, après avoir checké cette page web http://www.opengl.org/registry/api/glext.h où l'on trouve ces données dans un bloc de code C++

Code : Tout sélectionner

#ifndef GL_VERSION_1_4
GLAPI void APIENTRY glPointParameterfv (GLenum, const GLfloat *);
Define GL_POINT_DISTANCE_ATTENUATION     0x8129
Après avoir ajouté, j'ai un "POLINK unresolved symbol glPointParameterfv"

Code : Tout sélectionner

#GL_POINT_DISTANCE_ATTENUATION = $8129
Essaye donc @8 , et vire l'underscore "_" si il le faut.

Code : Tout sélectionner

 As "_glPointParameterfv@8"
ou

Code : Tout sélectionner

 As "glPointParameterfv@8"
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

Oups ce que je voulais dire c'est que je dois importer glPointParameterfv et glPointParameterf si j'utilise cette routine:

Code : Tout sélectionner

glPointParameterfv_(#GL_POINT_DISTANCE_ATTENUATION, coeffs()) 
glPointParameterf_ (#GL_POINT_SIZE_MAX, 32.0) 
glPointParameterf_ (#GL_POINT_SIZE_MIN, 1.0) 

Cool pour le @8, c'est donc en fonction des vars, un int = 4 et un float aussi ? Edit: je viens de regarder le help/var Encombrement en mémoire :oops:

J'ai essayé de faire toutes les combinaisons, underscore, @8, ca ne marche toujours pas. J'espère que c'est juste un problème de paramètres sinon il y aura d'autres trucs à implémenter.

Il est fort possible que glPointParameterfv_(#GL_POINT_DISTANCE_ATTENUATION, coeffs())
n'aille pas avec glPointParameterfv_(a.l,b.f)

coeffs() se prend 3 valeurs


ca ne marche pas mieux avec:
glPointParameterfv_(pname.d,*param.f) As "_glPointParameterfv@12"
glPointParameterfv_(pname.d,*param.f) As "glPointParameterfv@12"
glPointParameterfv_(pname.d,*param.f) As "_glPointParameterfv@16"
glPointParameterfv_(pname.d,*param.f) As "glPointParameterfv@16"
glPointParameterfv_(pname.d,*param.f) As "_glPointParameterfv@20"
glPointParameterfv_(pname.d,*param.f) As "glPointParameterfv@20"

glPointParameterfv_(a.l,b.f) As "glPointParameterfv@8"
glPointParameterfv_(a.l,b.f) As "_glPointParameterfv@8"
glPointParameterfv_(a.l,b.f) As "glPointParameterfv@12"
glPointParameterfv_(a.l,b.f) As "_glPointParameterfv@12"
glPointParameterfv_(a.l,b.f) As "glPointParameterfv@16"
glPointParameterfv_(a.l,b.f) As "_glPointParameterfv@16"
glPointParameterfv_(a.l,b.f) As "glPointParameterfv@20"
glPointParameterfv_(a.l,b.f) As "_glPointParameterfv@20"


(même msg d'erreur)
Anonyme

Message par Anonyme »

*param.f
un pointeur flottant ?? j'ai jamais vu :D

quand tu passes un tableau en paramètre c'est comme ceci :

glPointParameterfv_(#GL_POINT_DISTANCE_ATTENUATION, @coeffs())

tu as bien mis ImportC ?

sinon essaye avec les prototypes
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

c'est pas une question de déclaration en soit, c'est juste que le fichier opengl32.lib est trop ancien (antérieur à la version 1.4)

mets le à jour et tu pourras importer tes fonctions comme ceci :

Code : Tout sélectionner

ImportC "opengl32.lib"
  glPointParameterf_(pname.d, coeff.f) As "_glPointParameterfEXT@8"
  glPointParameterfv_(pname.d, *coeffs) As "_glPointParameterfvEXT@8"
EndImport
Dri

PS. plutot qu'une mise à jour "hasardeuse" faudrai le signaler à fred
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

Cpl.Bator: effectivement, c'est noté ;P

Dr. Dri: j'ai téléchargé une autre version (j'ignore quelle révision) de opengl32.lib (ici: http://www.hawksoft.com/download/ mesa3lib.zip(50K) ) ~340K au lieu de ~80K

Ca me semble être bon, il y a maintenant un nouveau message d'erreur:
"Constant not found."

J'ai ajouté ça (j'ai trouvé 8129 dans un listing C++ comportant la fonction glPointParameterfv, Define GL_POINT_DISTANCE_ATTENUATION 0x8129 )

Code : Tout sélectionner

 #GL_POINT_DISTANCE_ATTENUATION = $8129
Message d'erreur:
"Le point d'entrée de procédure _glPointParameterfvEXT@8 est introuvable dans la bibliothèque de liasons dynamique OpenGL32.DLL"

A prioris c'est pas $8129

Merci pour votre aide! ;)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Buckethead a écrit :Message d'erreur:
"Le point d'entrée de procédure _glPointParameterfvEXT@8 est introuvable dans la bibliothèque de liasons dynamique OpenGL32.DLL"
là à priori c'est TON opengl (opengl32.dll) qui est antérieur à la version 1.4

Dri
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

Le con c'était dans le message en plus... Je m'embrouille.

J'ai cherché la DLL, je n'ai trouvé que le même fichier de 713 728 octets (j'ignore encore comment connaitre la version, peut être avec "Everest")

Puis je suis tombé sur ca:
Comment mettre à jour ma version d'OpenGL ?

C'est impossible, vous devrez utiliser la version fournie par votre système d'exploitation. Sous Windows par exemple aucune mise à jour n'a été faite depuis Windows 98, la version d'OpenGL fournie étant donc toujours la 1.1.


Pas de panique cependant : vous pourrez bien entendu utiliser les fonctionnalités des versions supérieures, pour cela il suffit de les charger dynamiquement via le système d'extensions.
http://jeux.developpez.com/faq/opengl/? ... XT_charger

bref je vais voir + tard.. là je sature ;)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

si tu veux connaître ta version d'opengl32.dll et les extensions installées voila un petit bout de code :

Code : Tout sélectionner

hdc = GetDC_( OpenWindow(0, 10, 10, 320, 240, "OpenGL Test", #PB_Window_Invisible) )

pfd.PIXELFORMATDESCRIPTOR\nSize = SizeOf(PIXELFORMATDESCRIPTOR)
pfd\nVersion     = 1
pfd\dwFlags      = #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER | #PFD_DRAW_TO_WINDOW
pfd\dwLayerMask  = #PFD_MAIN_PLANE
pfd\iPixelType   = #PFD_TYPE_RGBA
pfd\cColorBits   = 16
pfd\cDepthBits   = 16 

pixformat = ChoosePixelFormat_(hdc, pfd)
SetPixelFormat_(hdc, pixformat, pfd)

hrc = wglCreateContext_(hdc)
wglMakeCurrent_(hdc,hrc)

#GL_VERSION    = $1F02
#GL_EXTENSIONS = $1F03

Debug PeekS( glGetString_(#GL_VERSION) )
Debug ""

ext.s = PeekS( glGetString_(#GL_EXTENSIONS) )

For i = 1 To CountString(ext, " ")
  Debug StringField(ext, i, " ")
Next i
Dri

PS. c'est assez galère je l'admet
Anonyme

Message par Anonyme »

Code : Tout sélectionner

#GL_VERSION    = $1F02
Version gl 1.2 ?? non ? 8O
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Cpl.Bator a écrit :

Code : Tout sélectionner

#GL_VERSION    = $1F02
Version gl 1.2 ?? non ? 8O
nan, la constante GL_VERSION permet de demander la version (sous forme de chaîne) à la fonction glGetString()

Dri
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Je viens de faire rouler le code de Dr.Dri et la version d'openGL est 1.5.5
(WinXP SP2).

A+
Guimauve
Répondre