Calcul de coordonnées sphériques
Bonjour à tous,
je rencontre un petit soucis avec des calcul en openCL.
Voici le kernel que j'utilise :
Code:
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;
} |
Voici un exemple pour le calcul sur 3 particules :
buffer de position (float3) : x, y, z
Code:
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:
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:
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 :
Code:
1 2 3 4
|
-0.36825183 -0.56796473 -0.7360752
0.0 3.1634076 0.119728826
2.032655 0.0 0.0 |
les trois premiers float sont correct mais le reste non !
si j'envoi pour tester les valeurs de mes angles et rayon comme ceci :
Code:
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;
} |
ca me renvoi bien mes angles :
Code:
1 2 3 4
|
4.13716 2.39805 1.0
1.24682 0.03783 1.0
3.76207 1.07008 1.0 |
J'en conclu donc que c'est lors du calcul avec les sin() et cos() que ça fait n'importe quoi !!
Mais je ne vois pas pourquoi...
Si quelqu'un a une idée, merci d'avance ;)