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] Problème d'affichage de ligne avec l'utilisation de l'opérateur mod() et dFdx/dFdy


Sujet :

OpenGL

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 9
    Par défaut [GLSL] Problème d'affichage de ligne avec l'utilisation de l'opérateur mod() et dFdx/dFdy
    Bonjour à vous ,

    Dernièrement, j’ai voulu me replonger dans les shaders, notamment via GLSL, et j’ai tenté de suivre une vidéo de OGLDev :

    J’ai donc essayé de reprendre son vertex shader et son fragment shader :

    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
     
    #version 420 core
     
    out vec3 WorldPos;
    uniform mat4 viewMatrix;
    uniform mat4 projectionMatrix;
     
    const vec3 positions[4] = vec3[4](
            vec3(-1.0, 0.0, -1.0), // TL
            vec3(1.0, 0.0, -1.0), // BL
            vec3(1.0, 0.0, 1.0), // BR
            vec3(-1.0, 0.0, 1.0) // TL
        );
     
    const int indices[6] = int[6](0, 2, 1, 2, 0, 3);
     
    void main() {
        // gl_VertexID [0 : 5] because the shader is use a gldraw with 6 as parameters
        WorldPos = positions[indices[gl_VertexID]];
        vec4 Pos = projectionMatrix * viewMatrix * vec4(WorldPos, 1.0);
        gl_Position = Pos;
    }
    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
     
    #version 420 core
    in vec3 WorldPos;
    out vec4 FragColor;
     
    void main()
    {
        float gridCellSize = 0.25;
        vec4 blackColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
     
        float lx = length(vec2(dFdx(WorldPos.x), dFdy(WorldPos.x)));
        float ly = length(vec2(dFdx(WorldPos.z), dFdy(WorldPos.z)));
        vec2 dxdy = vec2(lx, ly);
     
        float d = mod(WorldPos.z, gridCellSize);
        float lod0a = 1.0f - d / ly;
     
        FragColor = blackColor;
        FragColor.a *= lod0a;
    }
    Je place ma camera de sorte a ce qu'elle soit parfaite en face du plan crée. Il se trouve que certaines ligne sont plus transparente que d'autre :
    Nom : faded lines 2.png
Affichages : 93
Taille : 3,9 Ko

    J’ai tenté de chercher une cause par moi-même ainsi qu’en utilisant ce bon vieux ChatGPT, mais malheureusement aucune des réponses qu’il m’a données ne m’a convaincu.
    Je pense bien évidemment que cela est lié à l’utilisation de dFdx / dFdy, mais je trouve cela étrange que certaines lignes verticales au centre soient plus transparentes que celles situées aux extrémités,
    puisque la taille projetée sur un pixel devrait normalement être plus grande aux extrémités du plan qu’en son centre, du fait de la projection perspective et donc en utilisant la fonction lod0a du fragment shader, les lignes les
    plus aux extrémité du plan devrait être transparente. Si quelqu'un a une réponse a ce problème je suis fort intéressé .

    Note : J'ai deja pu résoudre mon soucis en changeant de formule mais je n'arrive toujours pas à expliquer le problème dont j'ai parlé...

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 218
    Billets dans le blog
    162
    Par défaut
    Bonjour,

    Je dois dire, je ne pourrais pas dire précisément la raison. Vous pouvez obtenir des détails, soit en affichant des résultats intermédiaires dans les autres canaux de couleur (RGB), soit en utilisant un débogueur GLSL permettant de tracer l'exécution du shader (pour un pixel donné).

    Au début (en ne regardant que la capture), je pensais c'était une imprécision liée au rendu (on tente d'afficher un objet à une position, qui tombe entre deux pixels de l'écran), mais cela n'est pas le cas, vu que la technique est totalement dans le pixel shader.

    Du coup, non, je ne vois pas ce qui change par rapport au tutoriel . J'ai pensé à des imprécisions dû aux virgules flottantes, ou encore au possible trans-typage, mais je ne vois pas le problème. Est-ce que cela pourrait être le setup ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/04/2013, 11h21
  2. [XSL-FO] Affichage de tolérances, avec des exposants sur deux lignes
    Par eliott31 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 05/10/2012, 17h57
  3. [MySQL] sélection des dernières lignes avec affichage aléatoire
    Par nabmoah dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 09/08/2008, 00h57
  4. [C#] Tableau avec regroupement, affichage en ligne
    Par doudou_rennes dans le forum Windows Forms
    Réponses: 1
    Dernier message: 29/08/2007, 11h01
  5. Affichage ligne avec condition dans /etc/passwd
    Par mzt.insat dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 17/04/2006, 22h25

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