Page 1 sur 2

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

Publié : ven. 16/nov./2007 20:04
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

Publié : ven. 16/nov./2007 21:26
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 :?:

Publié : ven. 16/nov./2007 22:35
par Anonyme
ou ceci :

Code : Tout sélectionner

ImportC "opengl32.lib"
glPointParameterf_(pname.d,*param.f) As "_glPointParameterf@12"
EndImport

Publié : sam. 17/nov./2007 12:25
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

Publié : sam. 17/nov./2007 14:29
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"

Publié : sam. 17/nov./2007 15:19
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)

Publié : sam. 17/nov./2007 15:48
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

Publié : sam. 17/nov./2007 16:08
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

Publié : sam. 17/nov./2007 16:49
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! ;)

Publié : sam. 17/nov./2007 17:07
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

Publié : sam. 17/nov./2007 17:44
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 ;)

Publié : sam. 17/nov./2007 18:15
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

Publié : dim. 18/nov./2007 0:44
par Anonyme

Code : Tout sélectionner

#GL_VERSION    = $1F02
Version gl 1.2 ?? non ? 8O

Publié : dim. 18/nov./2007 0:46
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

Publié : dim. 18/nov./2007 0:55
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