Fonctions 3D prédéfinies

Généralités sur la programmation 3D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Fonctions 3D prédéfinies

Message par comtois »

Je viens juste de voir que quelques fonctions 3D sont directement utilisables dans PB !

j'ai testé la soustraction de deux vecteurs, mais il y en a bien d'autres, comme le cross product ou dotproduct qu'on utilise souvent
Du coup ça va simplifier mes codes je pourrai faire appel à ces fonctions directement :)

Code : Tout sélectionner

Structure Vector3D
  x.f
  y.f
  z.f
EndStructure

Define u.Vector3D, v.Vector3D,t.Vector3D,*r.Vector3D
u\x=30
v\x=23
*r=D3DRMVectorSubtract_(@t,@u,@v)
Debug *r\x
Debug t\x
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

C'est curieux, ce sont des fonctions Directx... Y'aurait-il aussi celles d'Opengl?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ben oui, depuis longtemps, par contre je n'avais pas encore remarqué pour les fonctions directx .

Voir les exemples de NEHE codés en purebasic.
http://comtois.developpez.com/tutoriels ... engl/nehe/
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Ah oui c'est vrai. Ce serait bien que celles d'Ogre soient plus complètes, quand même... Je n'ai pas encore eu le temps de faire beaucoup de tests, et il y avait beaucoup de bugs, que Fred semble avoir corrigé pour la b4. Demain j'espère pouvoir attaquer la possibilité d'utiliser les shaders :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

les shaders, cool , j'espère que tu nous montreras comment les utiliser avec un exemple simple :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Les shaders permettraient d'ouvrir d'autres horizons, et de doper un peu la partie de Ogre fournis avec PB. Le jour ou cela sera
dispo, cela sera incontestablement un 'plus'. Ce qui serait bien aussi donc, c'est d'avoir accès (ou tout du moins
connaitre) les structures de bases des éléments définit en 3D, comme la structure interne d'une entité par
exemple (matrices, etc...)...
Force et sagesse...
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

tmyke a écrit :Les shaders permettraient d'ouvrir d'autres horizons, et de doper un peu la partie de Ogre fournis avec PB. Le jour ou cela sera
dispo, cela sera incontestablement un 'plus'. Ce qui serait bien aussi donc, c'est d'avoir accès (ou tout du moins
connaitre) les structures de bases des éléments définit en 3D, comme la structure interne d'une entité par
exemple (matrices, etc...)...
a priori c'est dispo avec la dernière beta, c'est pour cela que je vais faire des essais...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

je change de sujet :)

j'ai testé le cross product et la fonction normalize, c'est ok !
par contre je n'arrive pas à utiliser la fonction dotproduct !

Fonction Normalize

Code : Tout sélectionner

Structure Vector3D
  x.f
  y.f
  z.f
EndStructure

Define.Vector3D N,V1,V2,*R

V1\x=6 : V1\y=1 : V1\z=7
V2\x=6 : V2\y=1 : V2\z=7


Macro NORME(V)
   (Sqr(V\x * V\x + V\y * V\y + V\z * V\z)) 
EndMacro

Procedure Normalize(*N.Vector3D)
   Define.f NormeVecteur
  
   NormeVecteur = NORME(*N)
 	 If NormeVecteur <> 0
 	  *N\x / NormeVecteur
    *N\y / NormeVecteur
    *N\z / NormeVecteur
   EndIf
  
EndProcedure


Normalize(@V1)
D3DRMVectorNormalize_(@V2)
Debug "-- Normalize --"
Debug V1\x
Debug V1\y
Debug V1\z 
Debug "-----"
Debug V2\x
Debug V2\y
Debug V2\z 
Fonction CrossProduct

Code : Tout sélectionner

Structure Vector3D
  x.f
  y.f
  z.f
EndStructure

Define.Vector3D N,V1,V2,*R


Procedure PRODUIT_VECTORIEL(*N.Vector3D, *V1.Vector3D, *V2.Vector3D)
	*N\x = ((*V1\y * *V2\z) - (*V1\z * *V2\y))
  *N\y = ((*V1\z * *V2\x) - (*V1\x * *V2\z))
  *N\z = ((*V1\x * *V2\y) - (*V1\y * *V2\x))
EndProcedure


V1\x=2 : V1\y=3 : V1\z=7
V2\x=6 : V2\y=5 : V2\z=1
N\x=0  :  N\y=0 :  N\z=0
D3DRMVectorCrossProduct_(@N,@V1,@V2)
Debug "-- Cross Product --"
Debug N\x
Debug N\y
Debug N\z 
Debug "-----"
V1\x=2 : V1\y=3 : V1\z=7
V2\x=6 : V2\y=5 : V2\z=1
N\x=0  :  N\y=0 :  N\z=0
PRODUIT_VECTORIEL(@N,@V1,@V2)
Debug N\x
Debug N\y
Debug N\z 
Debug "-----"
Et le DotProduct ne fonctionne pas ? ou je merdouille ?
La fonction retourne l'adresse du premier paramètre.

Code : Tout sélectionner

Structure Vector3D
  x.f
  y.f
  z.f
EndStructure

Define.Vector3D N,V1,V2,*R

V1\x=6 : V1\y=1 : V1\z=7
V2\x=6 : V2\y=1 : V2\z=7

Procedure.f PRODUIT_SCALAIRE(*V1.Vector3D, *V2.Vector3D)
  ProcedureReturn (*V1\x * *V2\x + *V1\y * *V2\y + *V1\z * *V2\z) 
EndProcedure



Debug PRODUIT_SCALAIRE(@V1,@V2)
Debug D3DRMVectorDotProduct_(@V1,@V2)
Debug @V1
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Oui, ça ne fonctionne pas. J'ai essayé en normalisant mais ça ne donne rien. On dirait que la valeur renvoyée (qui devrait être de type D3DValue, ici un flottant) est convertie en entier.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

C'est un bug confirmé par srod sur le forum anglais.

Maintenant reste à comparer la vitesse des calculs entre mes fonctions et les fonctions directx.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Pour l'instant je n'ai pas réussi à utiliser les shaders. J'ai essayé en me basant sur http://www.ogre3d.org/wiki/index.php/Orange_Shader. Dans le log d'ogre j'ai
WARNING: material shader/orange has no supportable Techniques and will be blank. Explanation:
Pass 0: Fragment program shader/orangeFP cannot be used - not supported
J'ai essayé quelques autres méthodes (asm, hlsl) mais toujours le même résultat. Bizarrement, au dessus il me met que les "fragments programs" sont supportés. Je vais encore tester.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

djes a écrit :Pour l'instant je n'ai pas réussi à utiliser les shaders. J'ai essayé en me basant sur http://www.ogre3d.org/wiki/index.php/Orange_Shader. Dans le log d'ogre j'ai
WARNING: material shader/orange has no supportable Techniques and will be blank. Explanation:
Pass 0: Fragment program shader/orangeFP cannot be used - not supported
J'ai essayé quelques autres méthodes (asm, hlsl) mais toujours le même résultat. Bizarrement, au dessus il me met que les "fragments programs" sont supportés. Je vais encore tester.
Si tu veux jouer avec les Shaders, il faut que ta carte graphique supporte les shaders.

A+
Guimauve
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Guimauve a écrit :
djes a écrit :Pour l'instant je n'ai pas réussi à utiliser les shaders. J'ai essayé en me basant sur http://www.ogre3d.org/wiki/index.php/Orange_Shader. Dans le log d'ogre j'ai
WARNING: material shader/orange has no supportable Techniques and will be blank. Explanation:
Pass 0: Fragment program shader/orangeFP cannot be used - not supported
J'ai essayé quelques autres méthodes (asm, hlsl) mais toujours le même résultat. Bizarrement, au dessus il me met que les "fragments programs" sont supportés. Je vais encore tester.
Si tu veux jouer avec les Shaders, il faut que ta carte graphique supporte les shaders.

A+
Guimauve
Je dois rigoler, là?
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

comtois a écrit :C'est un bug confirmé par srod sur le forum anglais.

Maintenant reste à comparer la vitesse des calculs entre mes fonctions et les fonctions directx.
J'ai testé et aussi aberrant que cela paraisse le CrossProduct de DirectX est plus rapide qu'une Procédure mais lent qu'une Macro que celui que l'on peut programmer avec PureBasic.

Direct3D : 188 ms
PB Procedure : 359 ms
PB Macro : 125 ms

A+
Guimauve

Code : Tout sélectionner

Structure Vector3D
  x.f
  y.f
  z.f
EndStructure

Define.Vector3D n,V1,V2,*R


Procedure PRODUIT_VECTORIEL(*N.Vector3D, *V1.Vector3D, *V2.Vector3D)
  
  *N\x = *V1\y * *V2\z - *V1\z * *V2\y
  *N\y = *V1\z * *V2\x - *V1\x * *V2\z
  *N\z = *V1\x * *V2\y - *V1\y * *V2\x
  
EndProcedure

Macro PRODUIT_VECTORIEL_MACRO(VectorR, VectorA, VectorB)
  
  VectorR\x = VectorA\y * VectorB\z - VectorA\z * VectorB\y
  VectorR\y = VectorA\z * VectorB\x - VectorA\x * VectorB\z
  VectorR\z = VectorA\x * VectorB\y - VectorA\y * VectorB\x
  
EndMacro



V1\x=2 : V1\y=3 : V1\z=7
V2\x=6 : V2\y=5 : V2\z=1
n\x=0  :  n\y=0 :  n\z=0


Max = 10000000

time = GetTickCount_()
For Index = 0 To Max
  D3DRMVectorCrossProduct_(@n,@V1,@V2)
Next
MessageRequester("Direct3D", Str(GetTickCount_()-time))


time = GetTickCount_()
For Index = 0 To Max
  PRODUIT_VECTORIEL(@n,@V1,@V2)
Next
MessageRequester("PB Procedure", Str(GetTickCount_()-time))


time = GetTickCount_()
For Index = 0 To Max
  PRODUIT_VECTORIEL_MACRO(n,V1,V2)
Next
MessageRequester("PB Macro", Str(GetTickCount_()-time))
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Guimauve a écrit :
comtois a écrit :C'est un bug confirmé par srod sur le forum anglais.

Maintenant reste à comparer la vitesse des calculs entre mes fonctions et les fonctions directx.
J'ai testé et aussi aberrant que cela paraisse le CrossProduct de DirectX est plus rapide qu'une Procédure mais lent qu'une Macro que celui que l'on peut programmer avec PureBasic.

Direct3D : 188 ms
PB Procedure : 359 ms
PB Macro : 125 ms

A+
Guimauve

Code : Tout sélectionner

Structure Vector3D
  x.f
  y.f
  z.f
EndStructure

Define.Vector3D n,V1,V2,*R


Procedure PRODUIT_VECTORIEL(*N.Vector3D, *V1.Vector3D, *V2.Vector3D)
  
  *N\x = *V1\y * *V2\z - *V1\z * *V2\y
  *N\y = *V1\z * *V2\x - *V1\x * *V2\z
  *N\z = *V1\x * *V2\y - *V1\y * *V2\x
  
EndProcedure

Macro PRODUIT_VECTORIEL_MACRO(VectorR, VectorA, VectorB)
  
  VectorR\x = VectorA\y * VectorB\z - VectorA\z * VectorB\y
  VectorR\y = VectorA\z * VectorB\x - VectorA\x * VectorB\z
  VectorR\z = VectorA\x * VectorB\y - VectorA\y * VectorB\x
  
EndMacro



V1\x=2 : V1\y=3 : V1\z=7
V2\x=6 : V2\y=5 : V2\z=1
n\x=0  :  n\y=0 :  n\z=0


Max = 10000000

time = GetTickCount_()
For Index = 0 To Max
  D3DRMVectorCrossProduct_(@n,@V1,@V2)
Next
MessageRequester("Direct3D", Str(GetTickCount_()-time))


time = GetTickCount_()
For Index = 0 To Max
  PRODUIT_VECTORIEL(@n,@V1,@V2)
Next
MessageRequester("PB Procedure", Str(GetTickCount_()-time))


time = GetTickCount_()
For Index = 0 To Max
  PRODUIT_VECTORIEL_MACRO(n,V1,V2)
Next
MessageRequester("PB Macro", Str(GetTickCount_()-time))

Ca ne m'étonne pas, les procédures de PB sont très lentes à cause de l'empilage systèmatique des variables. DirectX fait sans doute plus de tests que toi, et il y a au moins un saut en plus par rapport à la macro, d'où une perte de perf relativement importante. D'un côté ton code, au besoin, tu peux l'optimiser, tandis que si tu utilises directx, tu gagnes en clarté et en (sic) compatibilité...
Répondre