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

OpenGL Discussion :

RayCasting : Accumulation couleur


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut RayCasting : Accumulation couleur
    Bonjour tout le monde,

    Je voulais savoir si quelqu'un pouvait me donner la formule pour accumuler la couleur lors d'un lancé de rayon.
    Je récupère la couleur de la texture comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float4 col = tex1D( transferTex, ( sample - transferOffset ) * transferScale );
    C'est du code cuda mais je poste dans OpenGL car c'est une technique graphique connu.
    Donc je peux avoir accès au canaux rgba avec col.x,col.y,col.z,col.w me manque plus qu'a savoir la formule que je n'arrive pas a retrouver.

    j'ai fait un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sum.x += col.x * col.w + ( 1.0 - col.w ) * sum.x;
    sum.y += col.y * col.w + ( 1.0 - col.w ) * sum.y;
    sum.z += col.z * col.w + ( 1.0 - col.w ) * sum.z;
    sum.w += sum.w + ( 1.0 - sum.w ) * col.w;
    Mais ça ne rend pas du tout comme il faut et j'ai oublié de rajouter la densité dans la formule.

    Merci d'avance.

  2. #2
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Je rajoute deux photos pour vous montrer la différence. Il y a la version back to front qui fonctionne bien et la version front to back où je n'arrive pas a cumuler les couleurs correctement.

  3. #3
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    Bravo, tu viens de découvrir que ton opération de blending (alpha * src + (1-alpha) *dst) n'est pas une opération commutative.

    Il faut donc faire le tri au préalable pour tracer de l'arrière vers l'avant (algorithme du peintre).

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  4. #4
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Merci pour les précisions mais je trace pas de l'arrière vers l'avant (back to front) mais de l'avant à l'arrière.
    Donc je lance le rayon à partir de l'œil, je fais des tests d'intersection et lorsque le rayon intersecte mon cube je commence a cumuler les couleurs le long du rayon selon un certain intervalle.

    EDIT :

    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
     
       // march along ray from back to front, accumulating color
       float4 sum = make_float4( 0.0f );;
       float t = tnear;
     
       for ( int i = 0; i < maxSteps; ++i ) {
          float3 pos = eyeRay.o + eyeRay.d * t;
          pos = pos * 0.5f + 0.5f;    // map position to [0, 1] coordinates
     
          // read from 3D texture
          float sample = tex3D( tex, pos.x, pos.y, pos.z );
     
          // lookup in transfer function texture
          float4 col = tex1D( transferTex, ( sample - transferOffset ) * transferScale );
     
          // accumulate result
          sum.x += col.x + ( 1.0 - col.w ) * sum.x;
          sum.y += col.y + ( 1.0 - col.w ) * sum.y;
          sum.z += col.z + ( 1.0 - col.w ) * sum.z;
          sum.w += col.w + ( 1.0 - col.w ) * sum.w;
     
          t += tstep;
     
          if ( t > tfar ) break;
       }
    Je mets le code un peu plus complet, sinon j'ai modifié en pensant que ça serait mieux mais j'obtiens le même résultat...

  5. #5
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    Deux solutions :

    Prends l'équation que tu as en calculant de l'arrière vers l'avant.
    Prends une feuille de papier et redérive l'équation dont tu aurais besoin de l'avant vers l'arrière.

    Tu peux aussi te rendre compte qu'en lancer de rayon un rayon peut avancer aussi bien de l'avant vers l'arrière que de l'arrière vers l'avant.

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  6. #6
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Citation Envoyé par LeGreg Voir le message
    Deux solutions :

    Prends l'équation que tu as en calculant de l'arrière vers l'avant.
    Prends une feuille de papier et redérive l'équation dont tu aurais besoin de l'avant vers l'arrière.
    en back to front le calcul se fait simplement avec cette ligne:
    sum = lerp( sum, col, col.w * density );
    sachant que lerp est une fonction qui fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // lerp
    inline __device__ __host__ float4 lerp(float4 a, float4 b, float t)
    {
        return a + t*(b-a);
    }
    Par contre en front to back je dois faire pour chaque composante du pixel contrairement a ce qui est fait en back to front et c'est la que je coince parce que j'ai bien chercher comment faire, j'ai trouvé mais quand je fais cela ne fonctionne pas.

    Citation Envoyé par LeGreg Voir le message
    Tu peux aussi te rendre compte qu'en lancer de rayon un rayon peut avancer aussi bien de l'avant vers l'arrière que de l'arrière vers l'avant.
    J'en suis bien conscient mais là je dois faire en front to back donc mes rayons ne font rien d'autre que d'aller de l'avant vers l'arrière.

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. Couleur d'une JComboBox disabled
    Par ced dans le forum Composants
    Réponses: 6
    Dernier message: 06/01/2004, 15h33
  3. Couleur des lignes dans DBGrid
    Par eddie dans le forum C++Builder
    Réponses: 5
    Dernier message: 21/06/2002, 18h15
  4. Mixage de Couleurs
    Par exxos dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 29/05/2002, 13h34
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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