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]Toon shading et caméra


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 37
    Par défaut [GLSL]Toon shading et caméra
    Bonjour !

    J'ai actuellement un problème avec mon shader. VOici le shader en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    varying vec3 Position;
    varying vec3 Normal;
    uniform mat4 modelMatrix;
     
    void main()
    {
            vec3 Position = modelMatrix * gl_Vertex;;
            Normal = gl_NormalMatrix * gl_Normal;
            gl_TexCoord[0] = gl_MultiTexCoord0;        
            gl_FrontColor = gl_Color;
            gl_Position = ftransform();
    }
    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
    uniform sampler2D tex;
    varying vec3 Position;
    varying vec3 Normal;
     
     
    void main()
    {
              vec3 LightSource = vec3(0, 1, 1);
              vec3 LightDir = normalize(vec3(LightSource -Position));
            float intensity = dot(LightDir, normalize(Normal));
            vec4 color = texture2D(tex,gl_TexCoord[0].st), color_final;
     
            if (intensity >= 1)
                    color *= 1.1;
            else if (intensity > 0.85)
                    color *= 0.85;
            else if (intensity > 0.75)
                    color *= 0.75;
            else if (intensity > 0.5)
                    color *= 0.5;
            else if (intensity > 0.25)
                    color *= 0.25;
            else
                    color *= 0.2;
     
            color.w = 1;        
     
            gl_FragColor = color;
    }

    Le shader fonctionne bien, sauf que les lumière se déplacent avec la caméra, comme si le shader en dépendait... alors que pas du tout (enfin je ne veux pas ce résultat ^^").

    J'ai donc recherché un peu, et vu qu'il ne fallait pas multiplié gl_Vertex par gl_ModelView dans le vertex shader mais juste par la matrice model. J'envois donc la matrice que j'utilise avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glMultMatrixf (&m_body->GetMatrix().matrix[0]);


    à mon vertex shader, et multiplie alors pour obtenir la position comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vec3 Position = modelMatrix * gl_Vertex;


    Sauf que ceci ne change pas grand chose... l'intensité calculé dans le pixel shader change encore en fonction de l'orientation de la caméra.

    Quelqu'un aurait une solution ?

  2. #2
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    dans ton vertex program :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vec3 Position = modelMatrix * gl_Vertex;
    il n'y aurait pas "vec3" en trop?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 37
    Par défaut
    Effectivement, il y avait bien le vec3 en trop. Mais j'ai toujours un problème...
    J'ai essayé de supprimer le gl_NormalMatrix, j'obtiens alors une lumière fixe mais qui est toujours la même quelle que soit la position de la lampe. Ce n'est donc pas non plus correct...

    Merci déjà !

  4. #4
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    si je comprends bien, tu obtiens toujours le même éclairage quelque soit la position de la lampe?

    et concernant la position de la caméra c'est réglé?

    si tu pouvais mettre des screens pour montrer, j'ai pas de machine pour dev sous la main ><

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 37
    Par défaut
    EDIT : En fait il subsiste une erreur, je fais des screen...

    Alors, voilà le shader que j'utilise :

    vert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    varying vec3 Position;
    varying vec3 Normal;
     
    void main()
    {
            Position = gl_ModelViewMatrix * gl_Vertex;
            Normal = gl_NormalMatrix * gl_Normal;
            gl_TexCoord[0] = gl_MultiTexCoord0;        
            gl_FrontColor = gl_Color;
            gl_Position = ftransform();
    }
    frag :
    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
    uniform sampler2D tex;
    varying vec3 Position;
    varying vec3 Normal;
    uniform mat4 lookat;
     
     
    void main()
    {
    	  vec3 lightPos = vec3(lookat* gl_LightSource[0].position); 
            vec3 LightDir = normalize(vec3(lightPos-Position));
            float intensity = dot(LightDir, normalize(Normal));
            vec4 color = texture2D(tex,gl_TexCoord[0].st), color_final;
     
            if (intensity > 0.95)
                    color *= 1.1;
            else if (intensity > 0.8)
                    color *= 0.85;
            else if (intensity > 0.75)
                    color *= 0.75;
            else if (intensity > 0.5)
                    color *= 0.5;
            else if (intensity > 0.25)
                    color *= 0.25;
            else
                    color *= 0.2;
     
            color.w = 1;        
     
            gl_FragColor = color;
    }
    Et j'obtiens alors ça :


    Sachant que le cercle de lumière qu'on aperçoit en dessous du personnage bouge avec lui...

    Si je met "vec3" devant Position, donc en fait si je laisse Position qui sera envoyé à 0 j'obtiens alors une lumière unidirectionnelle (ça se dit ? ^^) comme le soleil et j'obtiens ça :



    J'ai donc un problème pour les lumière comme les lampes. Comment puis-je régler ça ?

  6. #6
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    edit aussi : les screens sont tout petit '^^

Discussions similaires

  1. Réponses: 7
    Dernier message: 30/04/2015, 13h10
  2. [Irrlicht + GLSL]La lumière suis la caméra
    Par narugohan dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/08/2010, 19h48
  3. [GLSL] deferred shading: position d'origine
    Par zenux dans le forum OpenGL
    Réponses: 28
    Dernier message: 21/06/2010, 07h02
  4. [MFC] affichage image caméra dans un projet dialog
    Par Vestaproman dans le forum MFC
    Réponses: 3
    Dernier message: 07/02/2005, 13h27
  5. Opengl shading langage
    Par charly dans le forum OpenGL
    Réponses: 6
    Dernier message: 07/06/2004, 08h54

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