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] Lumière omni


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 [GLSL] Lumière omni
    Bonjour,

    J'essaye de faire un éclairage par pixel pour une lampe omnidirectionnel et je me base sur ce cours :
    http://www.lighthouse3d.com/opengl/g...php?pointlight

    Voici le code des shader :
    (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
    26
    varying vec4 diffuse, ambient;
    varying vec3 normal, lightDir, halfVector;
    varying float dist;
     
    void main()
    {
    	vec4 ecPos;
    	vec3 aux;
     
    	normal = normalize(gl_NormalMatrix * gl_Normal);
     
    	//light direction
    	ecPos = gl_ModelViewMatrix * gl_Vertex;
    	aux = vec3(gl_LightSource[0].position - ecPos);
    	lightDir = normalize(aux);
    	dist = length(aux);
     
    	//diffuse and ambient
    	diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;
    	ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
     
    	//specular
    	halfVector = normalize(gl_LightSource[0].halfVector.xyz);
     
    	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
    varying vec4 diffuse, ambient;
    varying vec3 normal, lightDir, halfVector;
    varying float dist;
     
    void main()
    {
    	vec3 n, halfV;
    	vec4 color = vec4(0.0);
    	float NdotL, NdotHV, att;
     
    	//normalize the interpolated normal
    	n = normalize(normal);
     
    	NdotL = max(dot(n, normalize(lightDir)), 0.0);
     
    	if (NdotL > 0.0)
    	{
    		//diffuse and ambient
    		att = 1.0 / (gl_LightSource[0].constantAttenuation + gl_LightSource[0].linearAttenuation * dist + gl_LightSource[0].quadraticAttenuation * dist * dist);
    		color = att * (diffuse * NdotL + ambient);
     
    		//specular
    		halfV = normalize(halfVector);
    		NdotHV = max(dot(n, halfV), 0.0);
    		color += att * gl_FrontMaterial.specular * gl_LightSource[0].specular * pow(NdotHV,gl_FrontMaterial.shininess);
    	}
     
    	gl_FragColor = color;
    }
    Le code fonctionne bien sauf quand la caméra est dans certaine position, je n'ait plus aucun éclairage (comme si la lumière s'éteignait) !

    NB 1 : Si j'utilise l'éclairage par vertex offert par OpenGL, la lumière ne s'éteint jamais.
    NB 2 : Le shader du site pour les lampe directionnel fonctionne sans problème.

    Il me semble donc que la seule partie du code qui pourrait être mauvaise se trouve dans le calcul de la position de la lumière :
    ecPos = gl_ModelViewMatrix * gl_Vertex;
    aux = vec3(gl_LightSource[0].position - ecPos);
    lightDir = normalize(aux);
    dist = length(aux);
    Merci d'avance...

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    perso, j'aurait plutot tendance à essayer d'utiliser ftransform pour recuperer la position du vertex que de faire la multiplication par la matrice (en même temps, je ne sait pas si on peut le faire ) car rien ne garantit que le resultat soit le même (c'est d'ailleurs pour ca que ftransform a été introduit)
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    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
    Merci pour ta réponse mais après quelques tests, je croit que le calcul de la position de la lumière est bon

    Le problème vient de cette ligne qui calcul le specular :
    color += att * gl_FrontMaterial.specular * gl_LightSource[0].specular * pow(NdotHV, gl_FrontMaterial.shininess);
    Et plus précisément, quand NdotHV est égal à 0.

    Si je fait ceci, je n'ait plus de problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(NdotHV)!=0.0)
      color += att * gl_FrontMaterial.specular * gl_LightSource[0].specular * pow(NdotHV, gl_FrontMaterial.shininess);
    Question : est-il correcte de faire ça ? Est-ce que l'éclairage offert par OpenGL procède comme ceci ?

Discussions similaires

  1. OpenGL GLSL : Lumières
    Par qnop dans le forum OpenGL
    Réponses: 8
    Dernier message: 18/06/2012, 14h33
  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] Position et direction d'une lumière
    Par coda_blank dans le forum OpenGL
    Réponses: 5
    Dernier message: 02/06/2010, 14h41
  4. Réponses: 19
    Dernier message: 07/11/2003, 08h10
  5. Problème lumière
    Par Francky033 dans le forum DirectX
    Réponses: 3
    Dernier message: 15/07/2003, 05h05

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