Bonjour à tous,
je rencontre un petit soucis avec des calcul en openCL.
Voici le kernel que j'utilise :
Voici un exemple pour le calcul sur 3 particules :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 // CALCUL DE COORDONNEES SPHERIQUE // // __global float3 *position_particules - buffer de vecteur 3 float pour le rendu OpenGL // __global float3 *AnglesRayon - buffer de vecteur 3 float contenant les angles générés aleatoirement __kernel void main_kernel( __global float3 *position_particule, __global float3 *AnglesRayon){ // Champ_particules.x = x - initialement 0.0f // Champ_particules.y = y - initialement 0.0f // Champ_particules.z = z - initialement 0.0f // AnglesRayon.x = Angle_Phi - angle aleatoire entre 0 - 2Pi // AnglesRayon.y = Angle_Theta - angle aleatoire entre 0 - Pi // AnglesRayon.z = rayon - 1.0f int ID_CH_PART = get_global_id(0); float Angle_Phi = AnglesRayon[ID_CH_PART].x; float Angle_Theta = AnglesRayon[ID_CH_PART].y; float rayon = AnglesRayon[ID_CH_PART].z; // calcul du vecteur resultant float DRx = rayon * sin(Angle_Theta) * cos(Angle_Phi); float DRy = rayon * sin(Angle_Theta) * sin(Angle_Phi); float DRz = rayon * cos(Angle_Theta); // creation vecteur resultant float3 VecteurDirection = (float3)(DRx, DRy, DRz); // Ajout du vecteur resultant à la position initiale de la particule position_particule[ID_CH_PART] += VecteurDirection; }
buffer de position (float3) : x, y, z
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
buffer des angles et rayon (float3) : angle_phi, angle_theta, rayon
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 4.13716 2.39805 1.0 1.24682 0.03783 1.0 3.76207 1.07008 1.0
Logiquement cela devrai me renvoyer les valeurs suivantes : ( ce qui fonctionne bien si je le calcul avec du code java !!! )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 -0.36825 -0.56796 -0.73608 0.01204 0.03585 0.99928 -0.71372 -0.51005 0.48005
Mais quand je lis mon buffer en sortie, je vois ceci :
les trois premiers float sont correct mais le reste non !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 -0.36825183 -0.56796473 -0.7360752 0.0 3.1634076 0.119728826 2.032655 0.0 0.0
si j'envoi pour tester les valeurs de mes angles et rayon comme ceci :
ca me renvoi bien mes angles :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 __kernel void main_kernel( __global float3 *position_particule, __global float3 *AnglesRayon){ // Champ_particules.x = x - initialement 0.0f // Champ_particules.y = y - initialement 0.0f // Champ_particules.z = z - initialement 0.0f // AnglesRayon.x = Angle_Phi - angle aleatoire entre 0 - 2Pi // AnglesRayon.y = Angle_Theta - angle aleatoire entre 0 - Pi // AnglesRayon.z = rayon - 1.0f int ID_CH_PART = get_global_id(0); float Angle_Phi = AnglesRayon[ID_CH_PART].x; float Angle_Theta = AnglesRayon[ID_CH_PART].y; float rayon = AnglesRayon[ID_CH_PART].z; // creation vecteur resultant float3 VecteurDirection = (float3)(Angle_Phi , Angle_Theta , rayon ); // Ajout du vecteur resultant à la position initiale de la particule position_particule[ID_CH_PART] += VecteurDirection; }
J'en conclu donc que c'est lors du calcul avec les sin() et cos() que ça fait n'importe quoi !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 4.13716 2.39805 1.0 1.24682 0.03783 1.0 3.76207 1.07008 1.0
Mais je ne vois pas pourquoi...
Si quelqu'un a une idée, merci d'avance![]()
Partager