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 :

GLSL - Opération de projection


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut GLSL - Opération de projection
    Bonjour à tous, je suis actuellement en train de coder un fragment shader pour faire du SSAO en GLSL en suivant cet algo : http://www.malmer.nu/index.php/2008-...-code/#more-14
    A un moment je dois trouver un point dans l'espace à partir d'un pixel, puis après avoir effectuer un calcul (dans l'exemple je ne le fais pas pour simplifier), retrouver le pixel qui correspond à ce point. J'arrive à retrouver le point dans l'espace de la caméra mais pas l'opération inverse J'ai copié les fonctions gluUnproject et gluProject (en enlevant la partie relative à l'espace du monde) en glsl et voilà ce que donne mon code simplifié :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    uniform sampler2D normalAndDepthTexture;
    uniform mat4 projScene;
    uniform mat4 invProjScene;
    uniform vec4 viewport;
    vec2 screensize = vec2(viewport[2]-viewport[0],viewport[3]-viewport[1]);
     
    vec3 project(vec3 point)
    {
        vec4 res = vec4(point,1.0);
     
        res = projScene * res;
        res.xyz = (res.xyz/res.w)*0.5 + 0.5;
     
        res.x = res.x * viewport[2] + viewport[0];
        res.y = res.y * viewport[3] + viewport[1];
     
        return res.xyz;
    }
     
    vec4 unproject(vec3 pixel)
    {
        vec4 point = vec4(0.0);
     
        point=vec4(pixel,1.0);
     
        point.x = (point.x - viewport[0]) / viewport[2];
        point.y = (point.y - viewport[1]) / viewport[3];
     
        point.xyz = point.xyz * 2.0 - 1.0;
     
        point = invProjScene * point;
     
        point.xyz = point.xyz / point.w;
        point.w = 1.0;
     
        return point;
    }
     
    void main(void)
    {
        float x = gl_FragCoord.x;
        float y = gl_FragCoord.y;
     
        vec4 color = vec4(0.0,0.0,0.0,1.0);
     
        vec4 texel = texture2D( normalAndDepthTexture, vec2(x/screensize.x,y/screensize.y));
        float z = texel.w;
     
        //AFFICHER PIXELS EN ENTREE : color = vec4(x/screensize.x,y/screensize.y,0.0,1.0);
        vec4 p = unproject(vec3(x,y,z));
        //AFFICHER POINTS DANS L'ESPACE : color = vec4(-p.x*screensize.x*0.5+0.5,-p.y*screensize.y*0.5+0.5,0.0,1.0);
        p = vec4(project(p.xyz),1.0);
        //AFFICHER PIXELS EN SORTIE : color = vec4(p.x/screensize.x,p.y/screensize.y,0.0,1.0);
     
        gl_FragColor = color;
    }
    Et voici une représentation du résultat, de gauche à droite les pixels sont coloriés en rouge, et de bas en haut en vert :
    En décommentant juste la première ligne commentée :

    En décommentant juste la deuxième ligne commentée :

    En décommentant juste la troisième ligne commentée :


    Comme on peut le voir, les deux première images sont correctes mais la dernière ne l'est pas, elle devrait être identique à la première vu que le point n'a pas été déplacé. Quelqu'un peut-il m'aider svp
    Merci d'avance

  2. #2
    Membre éprouvé Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Par défaut
    Je ne suis pas sur de bien avoir compris ce que tu souhaitais faire exactement.

    Après en fessant l'analogie "couleur" entre la premier et dernière image il semblerait que ta dernière image ne correspond qu'a la transition centrale des couleurs de la figure 1, une sorte de zoom sur un carré centrale de l'image.

    Si effectivement la figure 3 est un zoom centrale de l'image 1 alors c'est un problème de normalisation dans tes fonctions de project et unproject.

    Mais bon sans aucune garantie, le tout étant basé sur une correspondance chromatique au pif au mètre à vue d'oeil.

  3. #3
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Tu as très bien compris mon problème enfaite, je n'arrive pas à faire l'opération de projection après avoir fais l'unproject, pourtant j'ai copié les fonctions glu alors je vois pas pourquoi ça marche pas !
    Là j'ai découvert une nouvelle technique pour le faire, qui me parait bien moins couteuse (mais qui ne marche pas encore j'ai encore du mal ), enfaite dans le vertex shader pour chaque point de mon quad qui me permet d'afficher ma scène, je stock pour chaque vertex dans une variable varying, le vecteur correspondant de ma pyramide de projection. Pour chaque pixel celui-ci me donne donc une interpolation de celui-ci et donc le rayon correspondant au pixel. Si je fais des traitements dessus et que j'essaye de le reprojeter je n'y arrive toujours pas
    Une question par ailleurs qui me parait importante, quel doit être le Z minimum d'un point pour qu'il soit visible de la caméra, sachant que ce point est dans l'espace de la caméra !? est-ce 0.0, 1.0, ou Znear ?
    Pour calculer les vecteurs de ma pyramide de projection je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    float farZ = -camerarange.y;
    float farY = tan(45.0 / 2.0) * farZ;
    float farX = farY * 800.0/600.0;
     
    vec3 frustumCorners[4];
    frustumCorners[0] = vec3(-farX, farY, farZ);
    frustumCorners[1] = vec3(farX, farY, farZ);
    frustumCorners[2] = vec3(farX, -farY, farZ);
    frustumCorners[3] = vec3(-farX, -farY, farZ);
    Est-ce que je dois faire autres choses sur ces vecteurs avant de les utilisés comme les multiplier par la matrice view de ma caméra même si ça me paraitra pas logique m'enfin vu où j'en suis

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/11/2011, 13h15
  2. openGL/GLSL Projection matrix
    Par matador1mas dans le forum OpenGL
    Réponses: 0
    Dernier message: 15/02/2010, 17h04
  3. Réponses: 1
    Dernier message: 31/07/2009, 08h10
  4. opérations sur les dates
    Par coucoucmoi dans le forum Débuter
    Réponses: 2
    Dernier message: 12/08/2003, 11h45
  5. opération en XSL
    Par rastapopulos dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 12/03/2003, 22h39

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