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] Probleme de bump mapping


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut [GLSL] Probleme de bump mapping
    Bonjour à tous,

    J'essaie d'implémenter le bump mapping en utilisant GLSL. Je pense y etre presque mais il se trouve que lorsque je lance mon programme, la colorisation ne se fait pas. J'ai peur que ca soit du au fait que je calcule la tangent d'une manière un peu trop simpliste. La lumiere est une lumiere blanche (1.0,1.0,1.0).
    Voici le code de mon shader.

    bump.vs:
    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
     
    varying vec3 position;
    varying vec3 lightvec;
    void main()
    {
    	vec3 tangent; 
    	vec3 binormal; 
    	vec3 c1 = cross(gl_Normal, vec3(0.0, 0.0, 1.0)); 
    	vec3 c2 = cross(gl_Normal, vec3(0.0, 1.0, 0.0)); 
    	if(length(c1)>length(c2))
    	{
    		tangent = c1;	
    	}
    	else
    	{
    		tangent = c2;	
    	}
    	tangent = normalize(tangent);
     
    	binormal = cross(gl_Normal, tangent); 
    	binormal = normalize(binormal);
     
     
    	//----------------------------------------------------------
    	gl_Position = ftransform();
    	gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
    	position = gl_Vertex.xyz;
    	mat3 TBNMatrix = mat3(tangent, binormal, gl_Normal);
    	lightvec = gl_LightSource[0].position.xyz - position;
    	lightvec *= TBNMatrix;
    }
    bump.fs
    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
     
    uniform sampler2D base;
    uniform sampler2D normalMap;
    uniform vec3 CAMERA_POSITION;
    varying vec3 position;
    varying vec3 lightvec;
    void main()
    {
    	vec3 norm = texture2D(normalMap, gl_TexCoord[0].st).rgb * 2.0 - 1.0;
    	vec3 baseColor = texture2D(base, gl_TexCoord[0].st).rgb;
    	float dist = length(lightvec);
    	vec3 lightVector = normalize(lightvec);
    	float nxDir = max(0.0, dot(norm, lightVector));
    	vec4 diffuse = gl_LightSource[0].diffuse * nxDir;
    	float specularPower = 0.0;
    	if(nxDir != 0.0)
    	{
    	vec3 cameraVector = normalize(CAMERA_POSITION - position.xyz);
    	vec3 halfVector = normalize(lightVector + cameraVector);
    	float nxHalf = max(0.0,dot(norm, halfVector));
    	specularPower = pow(nxHalf, gl_FrontMaterial.shininess);
    	}
    	vec4 specular = gl_LightSource[0].specular * specularPower;
    	gl_FragColor = gl_LightSource[0].ambient +
    	(diffuse * vec4(baseColor.rgb,1.0)) +
    	specular;
    }
    Voici un screen de ce que ca donne:

  2. #2
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Salut,

    tu n'as pas besoin de calculer la tangente, elle t'es fournie directement par OpenGL. Pour celà, dans ton vertex shader déclare simplement ta tangente avant ton main(), comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    attribute vec3 vTangent;
     
    void main()
    {
     /* .... */
    }
    ensuite, pour calculer ta binormale, utilise une version "normalisée" de ta normale et de ta tangente, toutes deux multipliées par la matrice de normales:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    n = normalize(gl_NormalMatrix * gl_Normal);
    t = normalize(gl_NormalMatrix * vTangent);
    b = cross(n, t);
    A partir de là tu as les 3 vecteurs corrects, que tu peux utiliser dans ton vertex shader ou utiliser dans le fragment shader.
    Voilà je n'ai pas regardé le reste de ton code, mais si ton problème vient effectivement de tes vecteurs ca devrait le résoudre

  3. #3
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    En effet ca march mieux. Mais j'ai toujours des problèmes. L'eclairage n'est pas réaliste du tout. Par exemple, l'eclairage chage en fonction de la position de la caméra. Un autre exemple, plus j'eloigne ma source de lumiere, moins la face avant du perso est éclairée mais en revanche le dos du perso garde un eclairage constant.

  4. #4
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Je ne sais pas où tu en est dans ton programme, mais:
    - Est-ce que l'eclairage fonctionne correctement sans shaders? Si déjà là tu as des problèmes, vérifie que tes normales sont correctes, le positionnement de tes sources lumineuses (sont-elles fixes par rapport à ta scène ou suivent-elles la caméra?), etc... Evidemment tu n'auras pas de bump mapping à ce stade là.
    - Si c'est bon c'est que le problème vient du calcul de la lumière dans tes shaders. Commence par essayer d'obtenir un rendu correct de l'éclairage sans bump mapping, et une fois que c'est bon passe à la suite.

    Bien sûr si tout ca marchait déjà oublie ce qui précède...
    concernant le bump mapping je te recommande ce tutorial qui m'a bien aidé:
    http://www.ozone3d.net/tutorials/bump_mapping.php

  5. #5
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Citation Envoyé par ShevchenKik Voir le message
    Je ne sais pas où tu en est dans ton programme, mais:
    - Est-ce que l'eclairage fonctionne correctement sans shaders? Si déjà là tu as des problèmes, vérifie que tes normales sont correctes, le positionnement de tes sources lumineuses (sont-elles fixes par rapport à ta scène ou suivent-elles la caméra?), etc... Evidemment tu n'auras pas de bump mapping à ce stade là.
    Ca c'est OK.
    Citation Envoyé par ShevchenKik Voir le message
    - Si c'est bon c'est que le problème vient du calcul de la lumière dans tes shaders. Commence par essayer d'obtenir un rendu correct de l'éclairage sans bump mapping, et une fois que c'est bon passe à la suite.
    Que veux tu dire par là? Avant de faire le bump mapping, il faut que j'ai un éclairage par pixel correcte?

    Citation Envoyé par ShevchenKik Voir le message
    concernant le bump mapping je te recommande ce tutorial qui m'a bien aidé:
    http://www.ozone3d.net/tutorials/bump_mapping.php
    Déjà utilisé. D'ailleurs j'ai testé leur shader et c'est pas mieux.

  6. #6
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Dans le tutoriel, je viens de lire ceci :

    "La nouveauté réside dans le vecteur T qui est lui aussi fourni par le moteur 3D mais sous la forme d'un attribut de vertex (mot clé attribute dans le code GLSL)."

    Donc c'est le moteur 3D du site qui fournit le vecteur tangent et non Opengl, il me semble...
    Euh oui effectivement j'ai raconté n'importe quoi, désolé... Bref, sur le même site il y a une partie qui explique comment calculer la tangente (http://www.ozone3d.net/tutorials/mes...#tangent_space) et oh, surprise, c'est le code que tu avais utilisé au départ drcd.... Donc la boucle est bouclée...ahem
    Je pense qu'en gardant ca et en ajoutant les calculs de t,b,n que je t'ai filés ca devrait aider.

    Que veux tu dire par là? Avant de faire le bump mapping, il faut que j'ai un éclairage par pixel correcte?
    Disons que ce sont deux choses différentes, mais sans éclairage tu ne pourras pas voir ton bump mapping. Je te conseillais de commencer par obtenir un éclairage correct pour t'assurer que les bases sont là avant de passer à la suite

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Bonjour,

    Heu, je savais pas que la tangente était calculé directement par OpenGL, tu en es sur ? Quelqu'un peut confirmer ?

    Pourquoi ne l'on t-il pas appelé gl_Tangent au lieu de vTangent ?

  8. #8
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    J'avoue que cette histoire de tangente m'a un peu troublé aussi, mais c'est ce qui est décrit dans le tutorial cité dans mon post précédent. Tout ce que je peux te dire c'est que je l'ai testé et que ca marche.
    Je pense que le fait de déclarer la tangente avec le mot-clef "attribute" est tout ce qu'il faut à OpenGL pour faire le lien. Je n'ai pas encore beaucoup d'experience avec GLSL donc oui, si quelqu'un en sais plus c'est le bienvenu

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Dans le tutoriel, je viens de lire ceci :

    "La nouveauté réside dans le vecteur T qui est lui aussi fourni par le moteur 3D mais sous la forme d'un attribut de vertex (mot clé attribute dans le code GLSL)."

    Donc c'est le moteur 3D du site qui fournit le vecteur tangent et non Opengl, il me semble...

Discussions similaires

  1. Bump mapping Glsl
    Par coda_blank dans le forum Ogre
    Réponses: 0
    Dernier message: 13/04/2011, 16h26
  2. Réponses: 1
    Dernier message: 12/05/2008, 23h09
  3. [Struts][Tiles] Probleme d'action mapping avec un dynaform
    Par bluefox_du_974 dans le forum Struts 1
    Réponses: 3
    Dernier message: 28/03/2005, 22h47
  4. Comment faire du bump mapping
    Par CladStrife dans le forum DirectX
    Réponses: 7
    Dernier message: 01/01/2004, 05h07
  5. Bump mapping
    Par Francky033 dans le forum DirectX
    Réponses: 7
    Dernier message: 22/11/2003, 18h35

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