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 :

shader lumière sphere [OpenGL 3.x]


Sujet :

OpenGL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 19
    Par défaut shader lumière sphere
    Bonjour,

    Après avoir réussi à afficher une sphère, j'ai essayé de lui appliquer l'effet de lumière
    Ca marche mais quand je lui applique une rotation, la zone éclairé subi aussi la rotation alors qu'elle ne devrais pas (la lumière ne bouge pas normalement),
    ca vient du fait que j'utilise le in_Vertex sans les transformations.

    Comment résoudre le problème?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 126
    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 126
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Êtes vous certains d'appliquer la rotation uniquement sur la sphère et non sur l'ensemble de la scène ?
    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.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 19
    Par défaut
    C'est juste la sphère qui subit la rotation.
    Lorsque je fais les calculs, j'utilise la variable in_Vertex, donc c'est la position du vertex dans mon repère 3D sans les transformations.
    Comment avoir la position final du vertex dans le repère 3D?
    J'ai réessayé avec, cette fois ci, gl_Position mais ça ne marche pas (normal, c'est la position à l'écran)

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 126
    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 126
    Billets dans le blog
    149
    Par défaut
    Pour tourner la sphère, il faut changer sa matrice modèle (en la multipliant par une matrice de rotation, par exemple).
    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.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 19
    Par défaut
    J'ai ma matrice "modelview" que j'envoie au shader

    j'essaie avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final_vertex = modelview * vec4(in_Vertex, 1.0);
    et ca ne marche pas, ma sphere est meme plus éclairé.

    "final_vertex" est bien la position de mon vertex avec les transformations dans le repère 3D?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 126
    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 126
    Billets dans le blog
    149
    Par défaut
    Oui, en théorie.
    Je ne vois pas pourquoi votre sphère ne serait plus éclairé, sauf si la lumière est à l'intérieur

    Sinon, faudra nous montrer le code, ou le projet facilement compilable/testable.
    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.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 19
    Par défaut
    *** effect_light_sphere.vert ***

    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
     
    #vertex core 150
     
    in vec3 in_Vertex;
    in vec3 in_Color;
     
    uniform mat4 projection_modelview;
    uniform mat4 modelview;
    uniform vec3 uni_sphere_center;
    uniform vec3 uni_light_position;
     
    out vec3 color;
    out vec3 vertex;
    out vec3 sphere_center;
    out vec3 light_position;
     
    void main()
    {
       gl_Position = projection_modelview * vec4(in_Vertex, 1.0);
     
       color = in_Color;
       vertex = in_Vertex;
       sphere_center = uni_sphere_center;
       light_position = uni_light_position;
    }

    *** effect_light_sphere.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
     
    #vertex core 150
     
    in vec3 color;
    in vec3 vertex;
    in vec3 sphere_center;
    in vec3 light_position;
     
    out vec4 out_Color
     
    void main()
    {
       float     coef;
     
       coef = dot(normalize(light_position - vertex), normalize(vertex, sphere_position); 
       out_Color = vec4(* color , 1.0);
    }
    ca, c'est le code qui marche avec une sphere qui subit aucune transformations

    maintenant, en essayant d'implementer, j'en obtient ce code (qui marche pas):

    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
     
    #vertex core 150
     
    in vec3 in_Vertex;
    in vec3 in_Color;
     
    uniform mat4 projection_modelview;
    uniform mat4 modelview;
    uniform vec3 uni_sphere_center;
    uniform vec3 uni_light_position;
     
    out vec3 color;
    out vec3 vertex;
    out vec3 sphere_center;
    out vec3 light_position;
     
    void main()
    {
       gl_Position = projection_modelview * vec4(in_Vertex, 1.0);
     
       vec4 tmp = modelview * vec4(in_Vertex, 1.0);  //added
     
       color = in_Color;
       vertex.x = tmp.x; //added
       vertex.y = tmp.y; //added
       vertex.z = tmp.z; //added
       sphere_center = uni_sphere_center;
       light_position = uni_light_position;
    }

    *** effect_light_sphere.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
     
    #vertex core 150
     
    in vec3 color;
    in vec3 vertex;
    in vec3 sphere_center;
    in vec3 light_position;
     
    out vec4 out_Color
     
    void main()
    {
       float     coef;
     
       coef = dot(normalize(light_position - vertex), normalize(vertex, sphere_position); 
       out_Color = vec4(* color , 1.0);
    }

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 126
    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 126
    Billets dans le blog
    149
    Par défaut
    Le fragment shader ne compile pas

    Sinon, le problème de faire une partie du calcul dans le vertex shader c'est que votre variable vertex sera interpolé et je doute que vous vouliez une telle chose. Je crois, mais je ne suis plus très sur, qu'il faille mieux passer le vertex entrant au shader, avec la matrice associée, pour faire les calculs dans le pixel shader.

    Sinon, je viens de remarque qu'ici :
    Code glsl : Sélectionner tout - Visualiser dans une fenêtre à part
    vec4 tmp = modelview * vec4(in_Vertex, 1.0);  //added


    Je pense que c'est l'inverse de la matrice vue que vous voulez, mais encore une fois, je ne suis pas sur à 100 %
    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.

  9. #9
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Pour ma part je ne comprend pas pourquoi tu as 2 modelview :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    uniform mat4 projection_modelview;
    uniform mat4 modelview;
    Je verrais le truc comme cela perso :
    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
    #vertex core 150
     
    in vec3 in_Vertex;
    in vec3 in_Color;
     
    uniform mat4 projection_modelview;
    uniform mat4 modelview;
    uniform vec3 uni_sphere_center;
    uniform vec3 uni_light_position;
     
    out vec3 color;
    out vec3 vertex;
    out vec3 sphere_center;
    out vec3 light_position;
     
    void main()
    {
       gl_Position = projection_modelview * vec4(in_Vertex, 1.0);
     
       color = in_Color;
       vertex.x = gl_Position.x; //added
       vertex.y = gl_Position.y; //added
       vertex.z = gl_Position.z; //added
       sphere_center = uni_sphere_center;
       light_position = uni_light_position;
    }

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 126
    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 126
    Billets dans le blog
    149
    Par défaut
    D'après moi, c'est car l'une c'est une MVP (Modele * Vue * Projection), l'autre, juste la MV. En effet, pour calculer la lumière, il faut la position du vertex par rapport à la caméra (ainsi que la position de la lumière). Donc on place tous les points dans l'espace Vue. Pour transformer un point de l'espace scène à l'espace vue, tu multiplie par la MV. Pour avoir ton point pour l'afficher, il y a la projection qui rentre en compte, donc MVP.
    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.

  11. #11
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Ouais en faite je réfléchi a la base son code marche mais avec la rotation non , donc je voudrais surtout savoir comment il fait cette rotation (cote CPU il modifie in_Vertex ?).

    Parce que je viens de regarder mon code éclairage et je n'ai pas ce souci avec la rotation pourtant il est guère différent (par contre je fais les rotation du vertex).
    Plus simple et logique si c'est in_Vertex qui subit la rotation que la scène.

    PS : effectivement mon code est faux ,écrit dans la précipitation =P.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 19
    Par défaut
    Je viens de régler mon problème en remplaçant modelview par normalmatrix contenant juste les rotations

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/02/2012, 01h31
  2. [DX9 C#]Shader + Lumières
    Par funkydata dans le forum DirectX
    Réponses: 9
    Dernier message: 07/07/2006, 06h04
  3. Problème lumière
    Par Francky033 dans le forum DirectX
    Réponses: 3
    Dernier message: 15/07/2003, 05h05
  4. Vertex et Pixel Shader
    Par Riko dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/06/2003, 16h45
  5. carte graphique et pixels shader
    Par yeeep dans le forum DirectX
    Réponses: 2
    Dernier message: 26/04/2003, 10h54

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