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] Phong shader [OpenGL 3.x]


Sujet :

OpenGL

  1. #1
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut [GLSL] Phong shader
    Bonjour,

    Je suis en train de suivre le tutoriel D'OpenGL moderne sur ce site. Je suis plus ou moins coincé sur le shader d'illumination.
    Le shader du tuto fonctionne correctement mais je n'arrive pas à avoir un rendu lisse de mes faces.

    Nom : screenshot.png
Affichages : 630
Taille : 84,7 Ko

    Pourtant j'effectue bien mes calcules dans le fragment shader.

    Voici le vertex 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
    23
    24
    25
    26
    27
    28
    29
    30
    #version 330 core
     
    layout(location = 0) in vec3 vertexPosition_modelspace;
    layout(location = 1) in vec3 vertexNormal;
     
    // Output data
    out vec3 Position_worldspace;
    out vec3 Normal_cameraspace;
    out vec3 LightDirection_cameraspace;
    out vec3 EyeDirection_cameraspace;
     
    uniform mat4 Model;
    uniform mat4 View;
    uniform mat4 Projection;
    uniform vec3 PosLamp01;
    uniform vec3 PosCamera;
     
    void main()
    {
    	gl_Position =  Projection*View*Model * vec4(vertexPosition_modelspace,1);
    	Position_worldspace = (Model * vec4(vertexPosition_modelspace,1)).xyz;
     
    	Normal_cameraspace = (View * Model * vec4(vertexNormal, 0)).xyz;
     
    	vec3 vertexPosition_cameraspace = ( View * Model * vec4(vertexPosition_modelspace,1)).xyz;
    	EyeDirection_cameraspace = PosCamera - vertexPosition_cameraspace;
     
    	vec3 LightPosition_cameraspace = ( View * vec4(PosLamp01,1)).xyz;
    	LightDirection_cameraspace = LightPosition_cameraspace + EyeDirection_cameraspace;
    }
    et le 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #version 330 core
     
    // Input data
    in vec3 Position_worldspace;
    in vec3 Normal_cameraspace;
    in vec3 LightDirection_cameraspace;
    in vec3 EyeDirection_cameraspace;
     
    // Ouput data
    out vec3 color;
     
    uniform vec3 PosLamp01;
     
    void main()
    {
    	vec3 LightColor = vec3(1,1,1);
    	float LightPower = 30.0f;
     
    	vec3 MaterialDiffuseColor = vec3(1.0, 0.0, 0.0);
    	vec3 MaterialAmbientColor = vec3(0.1,0.1,0.1) * MaterialDiffuseColor;
    	vec3 MaterialSpecularColor = vec3(0.3,0.3,0.3);
     
    	float distance = length(PosLamp01 - Position_worldspace );
     
    	vec3 N = normalize(Normal_cameraspace);
    	vec3 L = normalize(LightDirection_cameraspace);
    	vec3 E = normalize(EyeDirection_cameraspace);
    	vec3 R = reflect(-L, N);
    	vec3 i_a = MaterialAmbientColor;
    	vec3 i_d = MaterialDiffuseColor * LightColor * LightPower * clamp(dot(L, N), 0, 1) / (distance*distance);
    	vec3 i_s = MaterialSpecularColor * LightColor * LightPower * pow(clamp(dot(E, R), 0, 1), 50) / (distance*distance);
    	color = i_a + i_d + i_s;
    }
    Merci d'avance pour votre aide
    Robin

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Salut !

    Franchement je ne sais pas, mais généralement j'effectue mon calcul de light direction dans mon fragment shader.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    J'ai exactement eu la même pensée que dragonjoker59.
    Mais en réalité, même avec un éclairage dans le vertex shader, on peut avoir un résultat plus lisse. Ce type de résultat est causé par : les normales.
    En effet, actuellement, vous avez une normale par face (comprendre, par triangle), alors que les sommets des triangles sont partagés par d'autres. Le fait que les faces sont apparentes ainsi, est dû au fait que la normale pour un sommet pour la face 1, sera d'une valeur A, alors que pour le même sommet pour la face 2, il sera d'une valeur B. Du coup, il y a cassure (ou non lissage).

    Pour régler ce problème, généralement on fait une moyenne des normales des faces partageant un même sommet. La moyenne permet d'avoir une normale par sommet et donc, de ne plus avoir de cassure.

    Oh ... j'espère avoir été un peu clair

    Après, il existe la technique des textures de normales : http://jeux.developpez.com/tutoriels...-des-normales/
    Mais c'est un peu différent.
    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.

  4. #4
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut
    Merci pour cette réponse

    Elle est claire

    Après l'affichage des normales j'ai remarqué qu'effectivement je n'avais pas qu'une normale par sommet. (ce qui est faux mathématiquement parlant )
    Existe-t-il une méthode propre pour fusionner ses normales ?
    Parce que là je vais partir sur un algo bourrin en O(N^3)

    Nom : screenshot2.png
Affichages : 537
Taille : 267,8 Ko

    Merci pour votre aide

  5. #5
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    Somme des N vecteurs normaux et division par N.

  6. #6
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut
    Je me suis mal exprimé :
    Y a t-il une méthode pour parcourir les sommets de mon mesh et identifier le moment pour je doit effectuer ma moyenne de normales et quand je ne doit pas le faire.
    Par exemple pour mon cube les normales sont correcte puisque je ne souhaite pas de lissage.

  7. #7
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Par rapport à ça, moi j'ai opté pour la fainéantise : c'est au fournisseur du mesh de s'assurer que les normales sont bonnes.
    Avant ça j'utilisais une méthode assez simple : découpage du mesh en submesh, lissage des normales sur toutes les faces des submeshes. ça fonctionne bien avec une sphère (1 seul submesh) ou un cube (6 submeshes) et je n'avais pas rencontré de problèmes.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  8. #8
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut
    Ha ha ha ^^
    C'est pas un peut facile ça

    Je posais juste la question pour savoir.
    Je vais utiliser mon algorithme gourmand pour ne pas surcharger les graphistes.

  9. #9
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Si en plus tu as des graphistes derrière, c'est évidemment à eux de s'occuper des normales de leurs modèles. Tu ne devrais pas avoir à en générer.
    Quel format utilisez-vous pour l'export/import ?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  10. #10
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut
    En faisant la moyenne des normales, ça fonctionne.

    Merci à vous

  11. #11
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Je persiste hein, ce n'est pas au moteur de générer des normales, mais aux graphistes!
    Vous utilisez un format propriétaire pour l'export/import?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Pour compléter la réponse concernant le lissage des normales,
    il y a une option sous blender permettant de lisser les normales dans l'éditeur.
    Les modifications se répercuteront ensuite sur le fichier d'export 'obj' lorsque l'on inclut les normales.

    Nom : Screenshot - 02_11_2016 , 19_17_11.jpg
Affichages : 445
Taille : 51,8 Ko

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

Discussions similaires

  1. Ogre et GLSL et shader
    Par aigle_07 dans le forum Ogre
    Réponses: 3
    Dernier message: 11/07/2010, 09h49
  2. [JOGL+GLSL] Fragment shader et sample2D
    Par xion.luhnis dans le forum OpenGL
    Réponses: 4
    Dernier message: 21/05/2009, 02h10
  3. Réponses: 8
    Dernier message: 23/11/2006, 14h34
  4. Réponses: 2
    Dernier message: 05/07/2006, 12h09
  5. pas d'éclairage du tout avec un shader "phong shading&q
    Par captainSeb dans le forum OpenGL
    Réponses: 3
    Dernier message: 06/06/2005, 11h48

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