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 :

Mon fragment shader de displacement ne fonctionne pas.


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Mon fragment shader de displacement ne fonctionne pas.
    Je souhaite redessiner une nouvelle frame avec des données de l'ancienne frame, mais ça ne fonctionne pas.

    Code cpp : 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
     
            const std::string transfFragVertexShader =
                            R"(#version 130
                            out mat4 newViewMatrix;
                            out mat4 projMat;
                            void main() {
                                gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
                                gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
                                gl_FrontColor = gl_Color;
                                newViewMatrix = gl_ModelViewMatrix;
                                projMat = gl_ProjectionMatrix;
                            })";
                            const std::string transfFragFragmentShader =
                            R"(#version 130
                            uniform mat4 oldViewMatrix;
                            in mat4 newViewMatrix;
                            in mat4 projMat;
                            uniform vec3 resolution;
                            uniform sampler2D oldFrameBuffer;
                            void main() {
                                vec4 oldFragPos = inverse(projMat) * gl_FragCoord;
                                oldFragPos /= oldFragPos.w;
                                oldFragPos = inverse(newViewMatrix) * oldViewMatrix * oldFragPos;
                                oldFragPos /= oldFragPos.w;
                                oldFragPos = oldFragPos * projMat;
                                vec2 position = (resolution.xy / oldFragPos.xy);
                                gl_FragColor = texture2D(oldFrameBuffer, position);
                            })";
     
        Edit / Delete Edit Post   Quick reply to this message Reply   Reply With Quote Reply With Quote   Multi-Quote This Message

    Et peut importe la couleur que j'affecte à gl_FragColor ça ne m'affiche toujours rien.

    Comment avoir les coordonnées vue du fragment pour le transformer en coordonnées vue de l'ancienne vue ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bon le soucis ne venait pas du shader mais d'ailleurs mais maintenant il y a texture2D qui déconne. (Ca ne me retourne pas le bon pixel de la frame précédente à la position x et y)
    Ca ne me faisait pas ça avant.

  3. #3
    Invité
    Invité(e)
    Par défaut Comment avoir la position du fragment sur la frame précédente ?
    Bon j'ai essayé plusieurs choses mais ça ne fonctionne pas.

    Tout d'abord j'ai essayé de faire simple en passant juste un offset au shader. (la translation de la caméra)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    math::Vec3f offsets = view.getPosition() - previousView.getPosition();
    transformFragShader.setParameter("uoffsets", offsets.x, offsets.y);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    vec2 position = (vec2(gl_FragCoord.x + uoffsets.x, gl_FragCoord.y - uoffsets.y) / resolution.xy);
    vec4 colors[2];
    colors[0] = vec4(0, 0, 0, 0);
    colors[1] = texture2D(oldFrameBuffer, position);
    bool b = (position.x >= 0 && position.y >= 0 && position.x <= resolution.x && position.y <= resolution.y);
    gl_FragColor = colors[int(b)];
    Mais ça me donne un effet bizarre sur les bords lorsque je déplace la caméra vers la droite ou vert le haut et donc, lorsque position > resolution. Normalement ça devrait m'afficher de la transparence (et donc rien) mais au lieu de ça, ça m'affiche un mauvais fragment, bref voici ce que ça me donne :
    Nom : Capture du 2019-01-29 13:54:37.png
Affichages : 157
Taille : 520,7 Ko

    J'ai essayé autre chose, c'est de récupérer les coordonnées vue du fragment et le reprojeter en le multipliant par la matrice de vue de la frame précédente mais ça ne fonctionne pas non plus. -_-

    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
     
    const std::string transfFragVertexShader =
                    R"(#version 130
                    out mat4 projMat;
                    out mat4 newViewMatrix;
                    void main() {
                        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
                        gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
                        gl_FrontColor = gl_Color;
                        projMat = gl_ProjectionMatrix;
                        newViewMatrix = gl_ModelViewMatrix;
                    })";
                    const std::string transfFragFragmentShader =
                    R"(#version 130
                    uniform mat4 oldViewMatrix;
                    uniform mat4 viewportMatrix;
                    in mat4 projMat;
                    in mat4 newViewMatrix;
                    uniform vec3 resolution;
                    uniform sampler2D oldFrameBuffer;
                    uniform vec2 uoffsets;
                    void main() {
                        vec4 ndc_coords = inverse(viewportMatrix) * gl_FragCoord;
                        vec4 clip_coords = inverse(projMat) * ndc_coords;
                        clip_coords /= clip_coords.w;
                        vec4 eyes_coords = inverse(newViewMatrix) * clip_coords;
                        eyes_coords = oldViewMatrix * eyes_coords;
                        clip_coords = projMat * eyes_coords;
                        clip_coords /= clip_coords.w;
                        vec4 old_FragCoord = viewportMatrix * clip_coords;
                        vec2 position = (old_FragCoord / resolution.xy);
                        vec4 colors[2];
                        colors[0] = vec4(0, 0, 0, 0);
                        colors[1] = texture2D(oldFrameBuffer, position);
                        bool b = (position.x >= 0 && position.y >= 0 && position.x <= resolution.x && position.y <= resolution.y);
                        gl_FragColor = colors[int(b)];
                    })";
    Ce qui pourtant fonctionne lorsque je le fais au niveau du CPU :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    RenderWindow window(sf::VideoMode(800, 600), "test");
        View currentView(600, 800, 0, 600);
        currentView.move(300, 300, 300);
        Vec3f point(0, 0, 0);
        Vec3f fragCoord = window.mapCoordsToPixel(point, currentView);
        View previousView(600, 800, 0, 600);
        Vec3f pointToHave = window.mapCoordsToPixel(point, previousView);
        std::cout<<currentView.getViewVolume().getPosition()<<"frag coord : "<<fragCoord<<" point to have : "<<pointToHave<<std::endl;
        fragCoord = window.mapPixelToCoords(fragCoord, currentView);
        fragCoord = window.mapCoordsToPixel(fragCoord, previousView);
        std::cout<<"coords : "<<fragCoord<<std::endl;
        return 0;
    Bref je ne sais plus trop quoi comment faire. (Hummm.....) Il me semble que opengl utilise le coin inférieur gauche comme coordonnée (0, 0) hors que moi j'utilise le coin supérieur gauche mais je ne pense pas que cela aie un impact avec la matrice du viewport...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 37
    Par défaut
    Le calcul suivant c'est une position 3D (ie dans le repère du "monde"), non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    math::Vec3f offsets = view.getPosition() - previousView.getPosition();
    Si oui c'est un problème de l'utiliser tel-quel dans le fragment shader, il faut transformer par la matrice de view et projeter le point sur l'écran.
    Chose faite dans la version CPU d'ailleurs, avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vec3f pointToHave = window.mapCoordsToPixel(point, previousView);
    EDIT:
    Normalement ça devrait m'afficher de la transparence (et donc rien)
    Quand tu dis "rien", tu penses "noir" ou "la couleur de pixel précédente" ? Sans clear global de la target en noir, l'effet affiché me semble compréhensible (on laisse la dernière couleur utilisée)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Le calcul suivant c'est une position 3D (ie dans le repère du "monde"), non ?
    Non c'est de la 2D.

    Quand tu dis "rien", tu penses "noir" ou "la couleur de pixel précédente" ? Sans clear global de la target en noir, l'effet affiché me semble compréhensible (on laisse la dernière couleur utilisée)
    La couleur du pixel précédent.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Apparemment mettre un glScissor sur le rectangle de la caméra de l'ancienne vue règle le problème pour le cas ou j'utilise une variable uniform mais j'aimerais avoir la même chose sans passer un uniform au shader.

Discussions similaires

  1. [JSF 2.X] Mon Autocomplete en Java ee ne fonctionne pas sous JSF
    Par Mocktar dans le forum JSF
    Réponses: 8
    Dernier message: 18/12/2018, 20h20
  2. Réponses: 8
    Dernier message: 17/03/2011, 09h16
  3. mon trigger ne fonctionne pas !
    Par japi33 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 20/03/2006, 21h26
  4. Réponses: 7
    Dernier message: 24/01/2006, 11h03
  5. OpenGL/C++/Shader ne fonctionnant pas
    Par Guildem dans le forum OpenGL
    Réponses: 13
    Dernier message: 06/10/2005, 09h21

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