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

DirectX Discussion :

Shader 2.0: specular problem on backfaces ?


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Par défaut Shader 2.0: specular problem on backfaces ?
    Bonjour, j'ai un petit soucis avec un pixel shader assez simple qui gère le specular dans mon programme, si on regarde un objet situé entre la lumière et la caméra il y a un reflet alors que le specular fonctionne bien dans les autres cas, je pense que c'est peut etre du à la fonction "reflect" qui calcul le vecteur de réflexion ( vecreflec = reflec( veclight , vecnormal ); )

    Est-ce possible que ça vienne de la et comment contourner le problème ?


    Merci

  2. #2
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    c'est possible d'avoir un petit screen?

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Par défaut
    Oui voila:


    bon si c'est tout moche c'est parceque les textures sont mauvaises, par contre en haut on voit que le shader fait ce qu'il faut, la lumière est loin derrière la caméra par contre en bas c'est la même chose vu de l'autre coté donc avec la lumière à l'horizon, il ne devrait donc y avoir aucun specular au lieu de ça j'ai cette sorte de lumière diffuse.

    Au niveau du code pour le specular, j'ai ça:
    float3 reflectWS = reflect(data.lightvec, normalWS);
    float4 reflectColor = pow( clamp(dot(reflectWS,viewWS),0,1), spec);
    donc lightvec c'est la direction de la lumière normalisée, normalWS c'est la normal biensûr et view c'est la direction du regard normalisée aussi et le tout en coordonnées absolues.

  4. #4
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    en fait tu dois avoir un éclairage spéculaire seulement dans le cas dot(normale au point, direction de la lumière) > 0, donc que ton point fait face à la lumière.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
                                                                 lumière
     
                           -----------
                           |         | de ce coté ci, la facette est face à la lumière
                           |         |
    -------------------------------------------------------------
    pas de ce coté là ^ donc pas de spéculaire

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Par défaut
    Oui je suis bien d'accord mais ça me rajoute des calculs...
    En fait j'ai trouvé vu que le probleme vient du fait qu'on ne sait pas trop ce que renvoi reflect sur une backface, j'utilise reflec sur le vecteur du regard comme ca les backfaces ne sont pas affiché de toute facon, il reste juste à calculer le dot regardreflété/lumiere avec le meme clamp ce qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	float3 reflectWS = reflect(viewWS, normalWS);
    	float4 reflectColor = pow(clamp(dot(reflectWS,data.lightvec),0,1), spec);
    Et ça marche ! Merci de m'avoir montré la lumière qui m'aveuglait !

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

Discussions similaires

  1. Probleme de diffuse shader dans un ray tracer
    Par dfrancis750 dans le forum Développement 2D, 3D et Jeux
    Réponses: 8
    Dernier message: 23/08/2009, 21h20
  2. JOGL, Shader et problem avec glGetUniformLocation
    Par wax78 dans le forum OpenGL
    Réponses: 1
    Dernier message: 09/04/2009, 14h39
  3. Réponses: 2
    Dernier message: 06/04/2009, 14h36
  4. Passer plusieurs textures à un shader : PROBLEME
    Par Bakura dans le forum OpenGL
    Réponses: 6
    Dernier message: 06/05/2008, 21h54
  5. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50

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