IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCL Discussion :

Calcul de coordonnées sphériques


Sujet :

OpenCL

  1. #1
    Candidat au Club Avatar de raphael-canovas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2016
    Messages : 2
    Points : 2
    Points
    2
    Par défaut 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 : 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;
     
    }
    Voici un exemple pour le calcul sur 3 particules :

    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 :
    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
    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 : 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;
     
    }
    ca me renvoi bien mes angles :
    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
    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

  2. #2
    Candidat au Club Avatar de raphael-canovas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2016
    Messages : 2
    Points : 2
    Points
    2
    Par défaut UP !!
    J'ai finalement trouvé la réponse à mon problème sur le site de Khronos

    From OpenCL C specs (Alignment of Types):

    "For 3-component vector data types, the size of the data type is 4 * sizeof(component). This means that a 3-component vector data type will be aligned to a 4 * sizeof(component) boundary. The vload3 and vstore3 built-in functions can be used to read and write, respectively, 3-component vector data types from an array of packed scalar data type."

    En gros le type float3 prends la taille d'un float4.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul de coordonnées sur Google Map
    Par queen_pitbull dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/08/2008, 11h05
  2. Réponses: 5
    Dernier message: 25/04/2008, 15h59
  3. Réponses: 6
    Dernier message: 16/04/2008, 19h42
  4. Calculer les coordonnées de la souris en 3D ?
    Par supergrey dans le forum DirectX
    Réponses: 3
    Dernier message: 26/08/2006, 21h47
  5. Probleme de coordonnées sphériques
    Par patatose dans le forum Moteurs 3D
    Réponses: 2
    Dernier message: 12/08/2006, 02h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo