Page 1 sur 2
Fonctions 3D prédéfinies
Publié : mar. 14/oct./2008 16:07
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
Publié : mar. 14/oct./2008 18:24
par djes
C'est curieux, ce sont des fonctions Directx... Y'aurait-il aussi celles d'Opengl?
Publié : mar. 14/oct./2008 18:31
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/
Publié : mar. 14/oct./2008 18:40
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

Publié : mar. 14/oct./2008 18:54
par comtois
les shaders, cool , j'espère que tu nous montreras comment les utiliser avec un exemple simple

Publié : mar. 14/oct./2008 19:33
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...)...
Publié : mar. 14/oct./2008 21:12
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...
Publié : mar. 14/oct./2008 21:27
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
Publié : mer. 15/oct./2008 9:48
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.
Publié : mer. 15/oct./2008 10:26
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.
Publié : jeu. 16/oct./2008 12:40
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.
Publié : jeu. 16/oct./2008 14:23
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
Publié : jeu. 16/oct./2008 14:36
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à?
Publié : jeu. 16/oct./2008 14:37
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))
Publié : jeu. 16/oct./2008 14:44
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é...