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

Vue hybride

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

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    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 : 653
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 confirmé

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 032
    Billets dans le blog
    12
    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
    27 070
    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 070
    Billets dans le blog
    144
    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 confirmé Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Loire (Auvergne)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    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 : 558
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 : 43
    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
    Par défaut
    Somme des N vecteurs normaux et division par N.

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

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    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.

+ 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