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

Développement 2D, 3D et Jeux Discussion :

[3D] Raytracer : anomalies visuelles (diffuse shading)


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 3
    Points : 1
    Points
    1
    Par défaut [3D] Raytracer : anomalies visuelles (diffuse shading)
    Je programme actuellement un raytracer en C++, et je rencontre des anomalies au niveau des rendus que j'obtiens.
    Comme une image est plus parlante qu'un long discours, voici mon problème :

    http://img113.imageshack.us/img113/715/rt2fl.png

    Comment me débarasser de ce phénmène d'anneaux sombres ?
    L'éclairage diffus est bien entendu calculé à l'aide du produit vectoriel entre la normale à la sphère et les rayons lumineux.

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Les cercles sombres ont l'air d'avoir comme centre les reflets des lumières, le problème pourrait donc venir des calculs sur les limites de celles-ci. Genre une valeur au dessous de 0, ou une mauvaise addition des contributions des lumières, ou que sais-je.

    A part ça aucune idée, mais ça peut être une piste.

  3. #3
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    A première vue, au risque de sortir une (grosse) bétise, je serais tenté de dire que tu te débarasserais des "anneaux" en te débarassant d'une des sphères ...

    Certains des anneaux semblent provenir des ombres et des reflets d'une sphère dans l'autre (de la petite sur la grande pour au moins deux des défauts que tu as entouré).
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Non la suppression d'une des sphère ne change rien.
    Ceci dit je n'effectue qu'un calcul pour l'éclairage diffus, pas de calcul d'ombrage (bon plus le Phong shading et les réflexions, mais ils ne sont pas à l'origine du problème, j'ai testé en les désactivant)
    Voici un bout du code de ma fonction de Ray tracing :

    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
    Vector3d lightRay;
    Vector3d normal;
    double dotProduct;
    double diffuse;
     
    CollisionInfos collision;
    Material entityMaterial;
     
    if(!GetClosestCollision(currentRay, &collision))
    	return;
     
    entityMaterial = entities[collision.entityId]->GetMaterial();
     
    // ...
     
    normal = entities[collision.entityId]->GetNormal(collision.point);
    normal.Normalize();
     
    for(unsigned int l=0 ; l<NB_LIGHTS ; l++)
    {
    	// Diffuse
    	lightRay = lights[l]->GetPosition()-collision.point;
    	lightRay.Normalize();
     
    	dotProduct = normal.DotProd(lightRay);
     
    	if(dotProduct<0.)
    		continue;
     
    	diffuse = dotProduct*entityMaterial.GetDiffuse();
    	currentColor += diffuse*entityMaterial.GetColor()*lights[l]->GetColor();
    }
    currentColor étant un Vecteur en 3d également.

    Bon j'ai mis le code brut, mais je pense que c'est assez explicite au niveau des manipulations réalisées (du moins pour ceux qui ont déjà essayé de programmer un raytracer)

  5. #5
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    C'est visible avec une source lumineuse, un objet et que du diffu ? (histoire de voir l'artefact dans sa plus simple expression)

    Je suis loin d'être un spécialiste mais le code a une bonne tête. Je suppose que que tu es confiant en ce qui concerne le calcul des normales de la sphère

    Dans l'ensemble ça semble localisé à la limite des zones s'influence des sources lumineuses (donc dotProduct~=0) mais peut-être pas tout à fait. Il faudrait vraiment voir avec une seule source pour localiser précisément où ça se produit, ou 2 si c'est un problème de mélange entre les sources.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entityMaterial.GetColor()*lights[l]->GetColor()
    Je doute que ça ait le moindre rapport mais par curiosité, c'est une multiplication de vecteurs composante à composante ?

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Oui il s'agit bien d'une multiplication composantes par composante.
    Sinon voici un rendu simplifié, en ne gardant que l'éclairage diffus, avec une et 2 sources :

    http://img147.imageshack.us/img147/5295/rt2fu.png

    Il s'agit effectivement d'un mélange entre les sources, mais ce phénomène d'assombrissement est tout de même bizarre, surtout que les composantes couleurs sont ajoutées et j'ai vérifié qu'à aucun moment l'une d'entre elle ne prenait un valeur négative... bizarre

  7. #7
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    J'ai peut-être une théorie. L'anneau correspond à la zone où l'un des éclairages s'annule. Avant on a la somme des deux lumières donc un résultat clair, et après l'autre lumière est plus intense. Donc ce pourrait être simplement les minimums de la somme des deux cosinus.

    L'effet doit être renforcé par le fait que le cosinus s'annule de façon assez brusque.

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/08/2003, 18h09
  2. [WSAD] Composition visuelle d'une applet
    Par schum11 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 09/04/2003, 16h19
  3. [visuel]ScrollBar et StatusBar
    Par psl dans le forum Composants VCL
    Réponses: 2
    Dernier message: 24/08/2002, 21h28

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